日本字符 - 字节长度

时间:2018-04-09 06:56:48

标签: java character-encoding

日本字符的长度,与美国字符的长度不同。

示例:

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字符的字节值

2 个答案:

答案 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}