Java 编码 - 损坏的法语字符
Java encoding - corrupted French characters
我有一个系统,我从第三方那里得到法语文本,但我很难让它变得可读。
String frenchReceipt = "RETIR�E"; // The original Text should be "RETIRÉE"
我尝试了所有可能的组合来使用 UTF-8 和 ISO-8859-1 编码转换字符串
String frenchReceipt = "RETIR�E"; // The original Text should be "RETIRÉE"
byte[] b1 = new String(frenchReceipt.getBytes()).getBytes("UTF-8");
System.out.println(new String(b1)); // RETIR�E
byte[] b2 = new String(frenchReceipt.getBytes()).getBytes("ISO-8859-1");
System.out.println(new String(b2)); // RETIR�E
byte[] b3 = new String(frenchReceipt.getBytes(), "UTF-8").getBytes();
System.out.println(new String(b3)); // RETIR?E
byte[] b4 = new String(frenchReceipt.getBytes(), "UTF-8").getBytes();
System.out.println(new String(b4)); //RETIR?E
byte[] b5 = new String(frenchReceipt.getBytes(), "ISO-8859-1").getBytes("UTF-8");
System.out.println(new String(b5)); //RETIR�E
byte[] b6 = new String(frenchReceipt.getBytes(), "UTF-8").getBytes("ISO-8859-1");
System.out.println(new String(b6)); //RETIR?E
byte[] b7 = new String(frenchReceipt.getBytes(), "UTF-8").getBytes("UTF-8");
System.out.println(new String(b7)); //RETIR�E
byte[] b8 = new String(frenchReceipt.getBytes(), "ISO-8859-1").getBytes("ISO-8859-1");
System.out.println(new String(b8)); //RETIR�E
如您所见,无法解决问题。
请指教
更新:
第三方合作伙伴确认以“ISO-8859-1”编码发送到我的应用程序的数据
� 只是一个替换字符 (EF|BF|BD
UTF-8),用于在系统无法呈现正确符号时指示问题。
这意味着您没有机会将 � 转换为 É。
frenchReceipt
不包含任何可以转换为 É 的字节序列,因为声明:
String frenchReceipt = "RETIR�E";
下面的代码片段应该可以正常工作,但您必须使用正确的字节源。
byte[] b2 = new String(frenchReceipt.getBytes()).getBytes("ISO-8859-1");
System.out.println(new String(b2));
因此,如果您从数据源按字节读取“RETIRÉE”并获得 52|45|54|49|52|C9|45
(预期为 ISO-8859-1),那么您将获得正确的结果。
如果数据源已经有字节序列EF|BF|BD
,你唯一的选择就是搜索和替换,但在这种情况下,ä和É之间没有区别。
更新:
由于数据由 TCP
传送
new BufferedReader(new InputStreamReader(connection.getInputStream(),"ISO-8859-1"))
解决了问题。
我有一个系统,我从第三方那里得到法语文本,但我很难让它变得可读。
String frenchReceipt = "RETIR�E"; // The original Text should be "RETIRÉE"
我尝试了所有可能的组合来使用 UTF-8 和 ISO-8859-1 编码转换字符串
String frenchReceipt = "RETIR�E"; // The original Text should be "RETIRÉE"
byte[] b1 = new String(frenchReceipt.getBytes()).getBytes("UTF-8");
System.out.println(new String(b1)); // RETIR�E
byte[] b2 = new String(frenchReceipt.getBytes()).getBytes("ISO-8859-1");
System.out.println(new String(b2)); // RETIR�E
byte[] b3 = new String(frenchReceipt.getBytes(), "UTF-8").getBytes();
System.out.println(new String(b3)); // RETIR?E
byte[] b4 = new String(frenchReceipt.getBytes(), "UTF-8").getBytes();
System.out.println(new String(b4)); //RETIR?E
byte[] b5 = new String(frenchReceipt.getBytes(), "ISO-8859-1").getBytes("UTF-8");
System.out.println(new String(b5)); //RETIR�E
byte[] b6 = new String(frenchReceipt.getBytes(), "UTF-8").getBytes("ISO-8859-1");
System.out.println(new String(b6)); //RETIR?E
byte[] b7 = new String(frenchReceipt.getBytes(), "UTF-8").getBytes("UTF-8");
System.out.println(new String(b7)); //RETIR�E
byte[] b8 = new String(frenchReceipt.getBytes(), "ISO-8859-1").getBytes("ISO-8859-1");
System.out.println(new String(b8)); //RETIR�E
如您所见,无法解决问题。
请指教
更新: 第三方合作伙伴确认以“ISO-8859-1”编码发送到我的应用程序的数据
� 只是一个替换字符 (EF|BF|BD
UTF-8),用于在系统无法呈现正确符号时指示问题。
这意味着您没有机会将 � 转换为 É。
frenchReceipt
不包含任何可以转换为 É 的字节序列,因为声明:
String frenchReceipt = "RETIR�E";
下面的代码片段应该可以正常工作,但您必须使用正确的字节源。
byte[] b2 = new String(frenchReceipt.getBytes()).getBytes("ISO-8859-1");
System.out.println(new String(b2));
因此,如果您从数据源按字节读取“RETIRÉE”并获得 52|45|54|49|52|C9|45
(预期为 ISO-8859-1),那么您将获得正确的结果。
如果数据源已经有字节序列EF|BF|BD
,你唯一的选择就是搜索和替换,但在这种情况下,ä和É之间没有区别。
更新: 由于数据由 TCP
传送new BufferedReader(new InputStreamReader(connection.getInputStream(),"ISO-8859-1"))
解决了问题。