0

キーの値に Unicode エスケープ文字が含まれている場合と含まれていない場合があるプロパティ ファイルがあります。以下のサンプルをご覧ください。私の仕事は、プロパティ ファイルの値に非 ASCII 文字が含まれている場合は、Unicode でエスケープする必要があることを確認することです。したがって、以下のサンプルでは、​​最初のエントリは問題ありません。2 番目のエントリのようなすべてのエントリを削除して、最初のエントリのように変換する必要があります。

##sample.properties
escaped=cari\u00F1o
nonescaped=cariño
normal=darling

基本的に私の質問は、Java に関する限り、cari\u00F1ocariñoを Java で同一のものとして扱うため、どうすればこれらを区別できるかということです。

4

4 に答える 4

2

Java のプロパティ ファイルは、Javaが正しく読み取るために、ISO-8859-1 文字セットで保存する必要があります。つまり、西ヨーロッパ言語の特殊文字をエスケープせずに使用できるということです。東ヨーロッパ、ロシア、中国など、他の言語の文字をエスケープせずに使用することはできません。

そのため、エスケープせずにプロパティ ファイルに表示できる非 ASCII 文字はごくわずかです。

文字がエスケープされているかどうかを検出するには、Properties クラスではなく、プロパティ ファイルを直接開く必要があります。Properties クラスは、ファイルをロードするときにすべてのエスケープ解除を行います。File クラスを使用するか、System.getResourceAsStream を InputStream として使用して開く必要があります。一度に 1 バイトずつ入力ストリームをスキャンし、すべてのバイトが 0x20 ~ 0x7E の範囲に加えて改行 \r および \n にあることを確認できます。これは、プロパティ ファイルで期待される文字の ASCII 範囲です。 .

翻訳者がプロパティ ファイルを直接書き込もうとしないことをお勧めします。プロパティ ファイルに変換するスプレッドシートなどのドキュメントを提供する必要があります。または、Attesoro (私が作成したもの) などの翻訳エディターを使用して、プロパティ ファイルを適切にエスケープして保存することもできます。

于 2013-03-03T12:10:16.167 に答える
1

この変換を正確に実行するツールを使用するだけnative2asciiです (非 ASCII 文字はすべてエスケープに変換されますが、既存のエスケープはそのまま残ります)。

于 2013-03-03T12:09:57.150 に答える
0

問題は、JavaPropertiesクラスがISO-8859-1エンコーディングを想定してプロパティファイルをデコードし、エスケープされたUnicode文字を解析することです。

したがって、Properties観点からは、これら2つの文字列は実際に同じです。

これら2つを区別する必要がある場合は、独自のパーサーを作成する必要があると思います

これは実際には、デフォルトで気にする必要のない機能です。最も奇妙なことに私を驚かせるのは、おそらく歴史的な理由から、(唯一の)エンコーディングがISO-8859-1であるということです。

于 2013-03-03T12:20:16.657 に答える
0

ライブラリICU4Jは、探しているもののようです。正規化のページをご覧ください。

于 2013-03-03T12:24:12.343 に答える