2016-07-11 7 views
2

ベトナムのすべてのネイティブに特別なリクエストがあります。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バイト配列のいずれかをとります。

+0

このJREはこの実行中ですか? – mjn42

+0

私の馬鹿。これは「Java(TM)SEランタイム環境(ビルド1.7.0_51-b13)」です。私は現在レガシーのため8に更新することができません。 – StanB123

+1

リンクされたWikipediaのページには、 'Windows-1258は、Unicodeの正規化の違いにより、Unicodeでエンコードされたベトナム語をいつも往復するとは限りません。 ' - おそらく、これは問題に関連しています – mjn42

答えて

1

解決策が見つからない場合は、ユニコードからデバイスに送信するバイトまで、常に独自のマッピングを作成できます。

+0

これは私がやったことであるので、これを答えとして受け入れています。私はEpson TM70II領収書プリンタを使用していますが、Windows-1258コードページが含まれていても、通常の文字と分音記号を組み合わせることはできません。 私は必要なすべての特殊文字を含むTCVN-3コードページを使いました。私はTCVN-3にユニコードをマッピングするためのクラス(私は共有できません)を書きました。 TCVN-3の奇妙な点は、大文字用のコードページが別にあることですが、コードページを巧みに切り替えることですべてがスムーズに機能します。 – StanB123

0

WindowsおよびC++の場合、非常に類似した問題が解決されました。this questionと解決策hereを参照してください。おそらくあなたはそれをJavaに移植することができます。