2011-11-10 105 views
1

我有以下代码:使用转换不可打印的字符在Java打印字符ISO8859_15_FDIS

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

中的第一个字符串的两个字符是:

  • - (96十六进制)
  • '(92 in hex)

ou代码的tput的是:

?? 

将被期待作为the code page for ISO8859_15_FDIS示出的是,上述两个字符是没有在表中的可打印部。

我想获得是一个可以接受的映射:

-' 

(即ISO8859_15_FDIS 2D27

有没有执行标准的Java API中的这种转换的方式,或者是我只需要在实际值和想要的值之间存储某种显式映射(Map<Character,Character>)?

对于上下文来说,我们有一个使用此字符集的Sybase数据库,当用户将这些字符粘贴到前端Web应用程序的文本区域时,它们最终会成为数据库中的问号。

+0

这两个字符实际上是0x2013和0x2019,您给出的值可能是他们在Windows 1252代码页中的编码。 –

回答

1

这样的代码是永远正确的:

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

上面的代码始终是一个转码错误。

从Windows 1252转码这些码点ISO8859_15_FDIS正确的方法如下:

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不支持这两个代码点(U + 2013和U + 2019),所以这将是一个有损耗的过程。您期待的值(U + 002D和U + 0027)在两种编码中都具有相同的字节值。

这些只是完全不同的代码点,您将不得不维护某种形式的规范化例程来映射具有视觉上类似字形的字符。