2011-02-09 9 views
3

私はUTF16LEエンコーディングの入力を持っています。この入力が自分のコードに到達するまでに、LineNumberReaderに格納されたFileReaderで囲まれたFileInputStreamを通過しました。Java文字列に無関係のデータが含まれています

[, 1, p, i, ...]

お知らせ空の要素へ:

"1 piece of data like a string"

しかし、この文字列に値を探しての線に沿って何かになります:最初の行が読み込ま

は、のような文字列を与えます開始。

いいえ、この文字列は、ここでは2つの関数に渡され、オブジェクトに変換され、基本的にはペースを通過しています。ある時点で、文字列の最初の部分(1または私の場合、小数点を含む任意の数)のみを実際のNumberに解析する関数に渡す必要があります。

この文字列の内容は"1"ように見えますが、値には、それは言う:

[, 1, p, i, ...]

ので、文字列全体がそこにまだあります。

いずれにしても、ParseExceptionが返されます。解析できない数値が例外メッセージに出力され、「1」は解析できない数値になります。

実際の問題は、後続の行が先頭の空の要素を除いて同様の動作を示して解析するため、先頭の空要素のように見えます。

+1

"しかし、この文字列を見ると、値は[、1、p、i、...]の行に沿ったものになります。それは意味をなさない。どのように文字列の要素を特定しましたか? Java文字列は 'char'sのシーケンスであり、"空文字 "というものはありません。デバッグ時に正確に何を確認しましたか? – sleske

+3

sleskeが示唆するように、「空の」要素は実際には空ではありません。数値ポイントを印刷して、どのコードポイントであるかを確認する必要があります。私の推測では、それはBOMと何か関係があるかもしれないということです。 – musiKk

+0

これはBOM(私は私の話にそれを加えておくべきです)ですが、LEはすでにそれを言っているので、UTF16LEはBOMを持つことはできません。それでも、パーサのエンコーディングは明示的にUTF16LEに設定されています。 私は、Eclipseデバッガを介して文字列の内容を識別し、私が書いたものは、Eclipseがコンテンツと言うものです。 –

答えて

0

私は答えがあると思います。エンコーディングはUTF16LEではありませんでした。自動文字検出アルゴリズムによってUTF16LEに設定されました。エンコーディングはBOM付きのutf16です。しかし、さまざまなクラスはエンコーディングがUTF16LEだと思っていたので、LEバージョンには存在してはいけないBOMを取り除いていませんでした。

+0

btw gvimはファイルをUTF16LEとしても識別します。私はソースファイルを作成しなかったし、テスト環境の外にあることも期待できませんでした。私はエンコーディングをより頻繁に推測することを余儀なくされました。 –

2

String(少なくともOpenJDKの実装)は、オフセットとカウントを持つchar[]を格納します。 Stringの実際の内容は、char[]の文字で、offsetまでのインデックスはoffset+countです。

つまり、char[]は実際にはStringより多くの文字を保持できます。

これは、異なるStringインスタンスの間でchar[]を共有できるようにするために行われます。例えば

あなたが値foobarStringを持っていて、それに.substring(3)を呼び出す場合、結果として得られるStringbarを表しますが、彼らは実際には同じchar[]を参照することがあります。 2番目のStringは、Stringと3より小さいcountの3つよりも大きいoffsetとなります。

Stringオブジェクトは本当に不変であるため、すべてが機能します。Stringはそれを一切変更しないため、完全に安全です。

これは、デバッガでStringオブジェクトを検査すると誤った印象を受ける可能性があることを意味します。したがって、String文字を検査する場合は、toCharArray()を呼び出すか、charAt()を呼び出して呼び出してください。

+0

ありがとうございます。これは、デバッガが置き換えるはずのデバッグコードを追加することを意味するのは残念です。それはちょうどそれが行く方法です。 –

+0

@ジャスパー:「文字列」ディスプレイは、時間の99%の正確で正確な値を表示します(つまり、「文字列」に印刷可能な文字のみが含まれるたびに)。また、デバッガで少量のコードを直接実行できるようにする必要があります。プロダクションコードに追加する必要はありません。 –

関連する問題