2011-11-10 3 views
1

を使用してJavaで印刷可能な文字を印刷できない文字の変換:Iは、以下のコードを有するISO8859_15_FDIS

System.out.println(new String("–’".getBytes("ISO8859_15_FDIS"))); 

最初の文字列に2つの文字は次のとおり

  • - (16進数96
  • '(92、16進数)

ouコードのTPUTは:the code page for ISO8859_15_FDISとして期待される

?? 

は、2つの文字は、上記の表の印刷可能な部分ではないことを示しています。

-' 

(ISO8859_15_FDIS中すなわち2D27

標準のJava API内でこの変換を実行する方法はあり、または午前:私は取得したいと思い何

は許容マッピングです実際の値と必要な値の間に何らかの明示的なマッピング(Map<Character,Character>)を格納する必要がありますか?

少しの文脈では、この文字セットを使用しているSybaseデータベースがあり、ユーザーはこれらの文字を前向きなWebアプリケーションのテキスト領域に貼り付けると、データベースに疑問符として終わります。このような

+0

これらの2つの文字は実際には0x2013と0x2019です。値はおそらくWindowsの1252コードページでのエンコーディングです。 –

答えて

1

コードが正しいことはありません:

new String(string1.getBytes(ENC_1), ENC_2); 

上記のコードは常にトランスコーディングのバグです。

次のようにISO8859_15_FDISするには、Windows-1252からこれらのコードポイントをトランスコードするための正しい方法は次のとおりです。

byte[] windows1252 = { (byte) 0x96, (byte) 0x92 }; 
String utf16 = new String(windows1252, Charset.forName("windows-1252")); 
byte[] iso8859_15_FDIS = utf16.getBytes(Charset.forName("ISO8859_15_FDIS")); 

のJava文字は、常に暗黙的にUTF-16と他のすべてのエンコーディングは、バイト配列を使用して表現する必要がありますされています。

ただし、ISO-8859-15では2つのコードポイント(U + 2013およびU + 2019)がサポートされていないため、この処理は不可解です。期待している値(U + 002DとU + 0027)は、両方のエンコーディングで同じバイト値を持ちます。

これはまったく異なるコードポイントであり、視覚的に似た書体を持つ文字をマップするための正規化ルーチンを維持する必要があります。

関連する問題