Java 怪人

Java 怪人,java,android,Java,Android,上面是我的代码。str中的特殊字符。它的长度是一,但字节是三。为什么?那么如何让它成为一个呢?如何使用java代码打印此字符?在我的android手机中,这个字符不能删除。根据文档,它是因为字符串被“编码”成字节的 使用平台的默认字符集将该字符串编码为字节序列,存储 结果生成一个新的字节数组。 当此字符串无法在默认字符集中编码时,此方法的行为未指定。 当需要对编码过程进行更多控制时,应使用CharsetEncoder类 您的特殊字符似乎是使用UTF-8编码的。UTF-8字符具有不同的字节大小,这

上面是我的代码。
str
中的特殊字符。它的长度是一,但字节是三。为什么?那么如何让它成为一个呢?如何使用java代码打印此字符?在我的android手机中,这个字符不能删除。

根据文档,它是因为字符串被“编码”成字节的

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

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

您可以在wikipedia页面中找到算法,并查看大小是如何确定的

从Java字符串
length()

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

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

  • 长度不是字节
您只有1个字符,但此字符的长度为3字节。一个字符串由几个字符组成,但这并不意味着一个1字符的字符串将是一个字节

  • 关于那个角色”ิ.
Java默认使用UNICODE(编码)ิ 实际上是0E34,这个值是泰国字符SARA的值。)

  • 关于您的编码问题

您需要更改应用程序进行字符集编码的方式,并使用utf-8编码。

在所有其他注释旁边。这里有一个小片段来可视化它

        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]);
输出

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));

你能更详细一点吗?请阅读Unicode以及如何在编程中处理它。
character length: 1
bytes: E0 B8 B4 
unicode name of the codepoint: THAI CHARACTER SARA I