2015-05-04 201 views
-3
 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]); 

以上是我的code.A spez char在str。它的长度是1,但是byte是3。如何使它成为一个?如何打印此char使用java代码?而在我的android手机中,这个字符不能删除。一个奇怪的字符

+1

你能更详细点吗? – Blip

+0

阅读Unicode以及如何在编程中处理它。 – Julian

回答

0

其因字符串“编码”成字节,根据文档

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

0

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

您可以在维基百科页面here中找到算法,并查看尺寸是如何确定的。

从Java字符串length()documentation

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

由于字符是使用3个字节进行编码的(而Unicode是一个字节),所以您得到的长度为3,而不是像您期望的那样长度为1。

0
  • Lenght是不是字节

你只有1个卡拉科特,但这卡拉科特是3个字节。一个字符串由多个字符组成,但这并不意味着1个字符串将是1个字节。

  • 有关卡拉科特 “ิ。

Java是通过使用UNICODE默认(编码”。ิ实际上是0E34,该值beeing泰语字符SARA)

  • 关于您的编码问题

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

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