当前位置: 首页 > 面试题库 >

Java 8 UTF-8编码问题(java bug?)

相旭
2023-03-14
问题内容

使用UTF-8编码创建字符串时存在不一致的地方。

运行此代码

public static void encodingIssue() throws IOException {
    byte[] array = new byte[3];
    array[0] = (byte) -19;
    array[1] = (byte) -69;
    array[2] = (byte) -100;

    String str = new String(array, "UTF-8");
    for (char c : str.toCharArray()) {
        System.out.println((int) c);
    }
}

在Java 1.8.0_20(及更早版本)上,我们得到结果

 65533

在Java 1.7和1.6上,我们得到正确的结果:

 57052

您遇到此错误了吗?有没有解决方法?

对于Shift_JIS,JIS_X0212-1990,x-IBM300,x-IBM834,x-IBM942,x-IBM942C,x-JIS0208来说,这种不一致也很明显,但显然UTF-8更为紧急。


问题答案:

它是“ Modified UTF-8

编码的一个属性,用于存储代理对(甚至该范围的未配对字符),例如单个字符。如果声称使用标准的解码器UTF-8使用“ Modified
UTF-8
” ,那就是一个错误。这似乎已在Java 8中修复。

您可以使用 指定 使用“ Modified UTF-8 ” 的方法可靠地读取此类数据:

ByteBuffer bb=ByteBuffer.allocate(array.length+2);
bb.putShort((short)array.length).put(array);
ByteArrayInputStream bis=new ByteArrayInputStream(bb.array());
DataInputStream dis=new DataInputStream(bis);
String str=dis.readUTF();


 类似资料:
  • 我想知道是否有人能帮忙,我很难将UTF-8字符发布到SagePay。数据库是MySQL,带有数据库字符集utf8和数据库排序规则utf8_general_ci。数据库连接字符串使用useUnicode=true 所有发布到数据库的数据都存储为UTF-8,所有查询的数据都显示为UTF-8,但当字符串编码如下时: 然后发到SagePay,他们会收到一个来自国际字符所在位置的乱码字符串。如果字符串中不包

  • 我在将文本从UTF-8编码转换为UTF-8编码时遇到问题。这里有字节数组, 我正在将其转换为UTF-8字符串并返回字节数组, 据我所知,这是一个3字节的数组。正当但这是我得到的。 这是什么原因?据我所知,在UTF-8 Specials中,2391189组合被称为替换字符。 这也是一个更大问题的一部分。

  • 我需要导出javascript数组到CSV文件和下载。我这么做了,但是'ó,ü,ö,ó,ş'这些字符在CSV文件中看起来像'\\\\\\\\\\\'。我已经尝试了这个网站上推荐的许多解决方案,但对我不起作用。 我添加了我的代码片段,有人能解决这个问题吗?

  • 我的内页有问题。它只是将页面识别为iso,但我想要utf-8,我将其声明为默认字符集。我尝试对freemarker配置进行一些修改,但没有效果。 springservlet。xml template.html login.html 输出

  • 我使用的是Jaspersoft Studio最终版本(v6.1.1)。我设计了我的报告,其中包含土耳其文字。从Studio导出报告为PDF时,虽然我已将Studio工作区编码设置为UTF-8,但不会显示土耳其语字符。此外,我已在JSF应用程序中嵌入jrxml报告文件并导出报告,结果是相同的。 我需要配置更多吗?

  • 我使用Java/Jsp开发了一个web应用程序,该应用程序运行在带有Tomcat 8的Ubuntu14.04 LTS服务器上,下面的UTF-8编码问题与部分符号§apperas有关。 在服务器端输入的任何章节符号§都将转换为§,我不知道为什么。 简单系统输出: