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手机中,这个字母无法删除。
答案 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