一个奇怪的角色

时间:2015-05-04 13:58:08

标签: java android

        String str = "ิ";
        System.out.println(str.length());
        byte[] b = str.getBytes();
        System.out.println(b[0]);
        System.out.println(b[1]);
        System.out.println(b[2]);

以上是我的代码。str中的特殊字符。它的长度是一,但byte是三。为什么?如何成为一个?如何使用java代码打印此char?在我的Android手机中,这个字母无法删除。

4 个答案:

答案 0 :(得分:0)

根据文档

,因为字符串被“编码”成字节

使用平台的默认字符集将此String编码为字节序列,存储      结果成一个新的字节数组。 未指定此字符串无法在默认字符集中进行编码时此方法的行为。  当需要对编码过程进行更多控制时,应使用CharsetEncoder类。

答案 1 :(得分:0)

您的特殊字符似乎是使用UTF-8编码的。 UTF-8字符具有不同的字节大小,具体取决于它们在范围内的位置。

您可以在维基百科页面here中找到该算法,并查看大小的确定方式。

来自Java字符串length() documentation

  

长度等于字符串中Unicode代码单元的数量。

由于字符使用3个字节进行编码(而Unicode是一个字节),因此长度为3,而不是长度为1。

答案 2 :(得分:0)

  • 长度不是字节

你只有1个字符,但这个字符长3个字节。 String由几个字符组成,但这并不意味着1个字符串将是1个字节。

  • 关于那个问题"ิ。

默认情况下,Java使用UNICODE(编码。"ิ实际上是0E34,这个值属于THAI CHARACTER SARA。)

  • 关于您的编码问题

您需要更改应用程序执行charset编码的方式,并改为使用utf-8编码。

答案 3 :(得分:0)

除了所有其他评论。这是一个可视化的小片段。

String str = "ิ"; // \u0E34
System.out.println("character length: " + str.length());

System.out.print("bytes: ");
for (byte b : str.getBytes("UTF-8")) {
    System.out.append(Integer.toHexString(b & 0xFF).toUpperCase() + " ");
}
System.out.println("");

int codePoint = Character.codePointAt(str, 0);
System.out.println("unicode name of the codepoint: " + Character.getName(codePoint));

<强>输出

character length: 1
bytes: E0 B8 B4 
unicode name of the codepoint: THAI CHARACTER SARA I
相关问题