日本字符的长度,与美国字符的长度不同。
示例:
String str = new String("アサヒコ");
int numBytes = str.getBytes().length; 12
for Us:
String str = new String("san");
int numBytes = str.getBytes().length; 3
我应该如何获得与US字符完全相同的JAPAN字节长度。
对于单个JAPAN字符,为什么它给出2个字节,有时它为单个JAPAN字符提供3个字节。
请告诉我如何获取java中的JAPAN字符的字节值
答案 0 :(得分:4)
没有参数返回的getBytes
调用取决于您的系统。从该文件:
使用平台的默认字符集将此String编码为字节序列,并将结果存储到新的字节数组中。
因此,例如,如果您的系统的默认编码是UTF-8,则可能需要四个字节来编码单个日语字符,但通常只需要一个字节来编码单个美国英语字母字符。更多信息the Unicode FAQ。
getBytes
的重载允许您指定要使用的编码。
更多背景资料:
Java的字符串是represented using UTF-16(这就是为什么Java可以使用整个Unicode,即使char
只有16位宽)。在UTF-16中,可能需要多个char
来表示一个“字符”(在Unicode用语中,可能需要多个代码单元来表示代码点)。如果要在字符串中访问代码点的数量,可以使用codePointCount
;要访问代码点,您可以使用codePoints
流。 String
还有一些其他与代码点相关的方法,只需在JavaDoc中搜索“codepoint”。
所有与String
相关的具体内容;转换为字节数组后,您可能会使用UTF-16以外的编码。
答案 1 :(得分:1)
Characters不是一个定义明确的概念。但通常你可以计算unicode代码点。
简单但繁重的开销(Java 9 +):
"アサヒコ".codePoints().count() // 4
旧学但效率更高(Java 1.5 +):
String mbtext = "アサヒコ";
int characterCount = mbtext.codePointCount( 0, mbtext.length() );
// characterCount = 4
这适用于大多数文本 - 英语,法语,CJK(中文,日文,韩文),阿拉伯文,你的名字。
有时会有modifier characters或其他非printables,会以这种方式单独计算。您可以删除它们以获得“可视”字符数(Java 7 +):
"か゚き゚く゚け゚こ゚\r\n".replaceAll( "[\\p{M}\\p{C}]+", "" ).codePoints().count() // 5
\p{M}
剥离标记,\p{C}
剥离换行符和制表符。要删除空格,请使用\p{Z}