ベトナムのすべてのネイティブに特別なリクエストがあります。Java文字列をWindows-1258に変換
Windows-1258コードページを使用して、プレーンJava文字列をバイト配列に変換しようとしています。この文字列の内容はベトナム語ですが、Windows-1258がベトナム語を念頭に置いて設計されているので、それは大きな問題ではありません。残念ながら、特定の文字は正しく変換されていません。
私のテストケース:
final Charset wcp1258 = Charset.forName("Cp1258");
final String text = "Việt là khó khăn";
byte[] textArr = text.getBytes(wcp1258);
for (int i = 0; i < textArr.length; i++) {
System.out.println(String.format("'%s' maps to: 0x%x", text.charAt(i), textArr[i]));
}
されて終わる:
'V' maps to: 0x56 'i' maps to: 0x69 'ệ' maps to: 0x3f <-- 't' maps to: 0x74 ' ' maps to: 0x20 'l' maps to: 0x6c 'à' maps to: 0xe0 ' ' maps to: 0x20 'k' maps to: 0x6b 'h' maps to: 0x68 'ó' maps to: 0xf3 ' ' maps to: 0x20 'k' maps to: 0x6b 'h' maps to: 0x68 'ă' maps to: 0xe3 'n' maps to: 0x6e
使用すると、1つの文字がWindows-1258で疑問符がある、3f
にマッピングされていることがわかります。
私は少しの研究を行い、Windows-1258が分音記号を組み合わせて特定の文字を作成することを発見しました。これらの文字の1つが疑問符にマッピングされました。
これを正しく変換するにはどうすればよいですか?私は問題が、Windows-1258に必要な組み合わせに対する特定のUnicode文字の有効な変換ではないことに関連していると思います。私はNormalizer
クラスをミックスに追加しようとしましたが、大成功はしませんでした。
あなたが不思議に思われる場合は、レシートプリンタを制御するためにこのエンコーディングが必要です。領収書プリンタは、ベトナム語のWindows-1258またはTCVN3バイト配列のいずれかをとります。
このJREはこの実行中ですか? – mjn42
私の馬鹿。これは「Java(TM)SEランタイム環境(ビルド1.7.0_51-b13)」です。私は現在レガシーのため8に更新することができません。 – StanB123
リンクされたWikipediaのページには、 'Windows-1258は、Unicodeの正規化の違いにより、Unicodeでエンコードされたベトナム語をいつも往復するとは限りません。 ' - おそらく、これは問題に関連しています – mjn42