1

メソッドはProperties.load(InputStream)、その入力で無効なバイトを報告しますか?

InputStreamAPI 仕様では、 は ISO 8859-1 (Latin-1) 文字エンコーディングを使用してテキストをエンコードする必要があると明確に述べています。これは、バイト値 0x81 ~ 0x9F を許可しません。IOExceptionしたがって、そのようなバイトが存在する場合は(aCharacterCodingExceptionが理想的です)をスローする必要があります。しかし、そうですか?そうでない場合、それらの無効なバイトをどのように処理しますか?

4

2 に答える 2

2

仕様の主張にもかかわらず、提供された実装は、これらの無効なバイトを Unicode 文字であるかのように扱います。0x81 ~ 0x9F の範囲のバイトは、C1 制御文字として解釈されます。ソースコードにはこれがあります:

 //The line below is equivalent to calling a
 //ISO8859-1 decoder.
 c = (char) (0xff & inByteBuf[inOff++]);

コメントの内容にもかかわらず、それはISO8859-1 デコーダーを呼び出すことと同等ではありません。


編集

実際、これは ISO-8859-1 (ハイフンに注意) デコーダーを呼び出すことと同じです。したがって、次の 2 つの解釈が可能です。

  • 提供された実装にはバグがあります。
  • 仕様 (API) 文書は、作成者の意図を正しく説明していません。ストリームが ISO-8859-1 エンコーディングを使用していることを示す必要があります。
于 2013-03-28T11:29:32.340 に答える
1

プロパティ ファイルの仕様によると、入力ストリームは ISO 8859-1 でエンコードされています。ただし、制御文字 (たとえば、ISO/IEC 6429 で指定されている) が違法であるとは具体的に述べていません。(実際には、それらのいくつか。たとえば、空白文字 HT、CR、NL は明らか合法です。) また、仕様では、仮想的に違法な文字がどうなるかについては述べていません。

実際、プロパティ リーダーは、8 ビット入力ストリーム内の制御コードを Unicode 内の対応する制御コードにマッピングする大まかなマッピングを行います。次に、プロパティ ローダーは、特定の意味を持たないすべての制御コードを単純な古い文字として扱い、キーと値にそのまま含めます。(ここでコードを読むことができます...興味があれば。

実際、Java ISO 8859-1 デコーダーのソース コード (たとえば、こちら) を見ると、デコーダーがまったく同じ方法で 8 ビット文字をマッピングしていることがわかります。言い換えれば、制御文字はすべて有効な ISO 8859-1 文字として扱われます ... Java 解釈に従って。その解釈は、IANA が推奨する解釈でもあることがわかります。

「1992 年に、IANA は文字マップ ISO_8859-1:1987 を登録しました。これは、ISO-8859-1 の優先 MIME 名でより一般的に知られています (ISO 8859-1 の上に余分なハイフンがあることに注意してください)、ISO 8859-1 のスーパーセットです。このマップは、割り当てられていないコード値に C0 および C1 制御文字を割り当て、可能なすべての 8 ビット値を介して 256 文字を提供します。

( http://en.wikipedia.org/wiki/ISO_8859-1 2013-03-29より引用)

要するに、「インターネット」での「ISO 8859-1」という用語の使用は、ISO/IEC 8859-1:1998 規格と完全には一致しませんが、実際には、この不一致によって規格がより有用になります。

(そして、Java / IANA が間違っていると思うなら、Java が ISO 仕様を文字どおりに解釈し、デコーダーが,とマップされていない文字に変わったら、どれほど苦痛になるか想像してみてください!)'\t''\n''\r'

于 2013-03-28T12:09:15.213 に答える