我有以下代码:
System.out.println(new String("–’".getBytes("ISO8859_15_FDIS")));
第一个String中的两个字符是:
96
)92
)代码的输出是:
??
预期the code page for ISO8859_15_FDIS表示上面的两个字符不在表的可打印部分。
我想得到的是可接受的映射:
-'
(即ISO8859_15_FDIS中的2D
和27
有没有办法在标准Java API中执行此转换,或者我只需要在实际值和所需值之间存储某种显式映射(Map<Character,Character>
)?
对于一些上下文,我们有一个使用此字符集的Sybase数据库,当用户将这些字符粘贴到前端Web应用程序的文本区域时,它们最终会成为数据库中的问号。
答案 0 :(得分: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)在两种编码中都具有相同的字节值。
这些只是完全不同的代码点,您必须维护某种形式的规范化例程来映射具有视觉上类似字素的字符。