找出Java/Android中UTF-8字符串中的字符数

Suj*_*kar 4 java android utf-8

当字符串以UTF-8存储时,我试图找出字符串长度.我尝试了以下方法:

String str = "???? ???";
Charset UTF8_CHARSET = Charset.forName("UTF-8");
byte[] abc = str.getBytes(UTF8_CHARSET);
int length = abc.length;
Run Code Online (Sandbox Code Playgroud)

这给出了字节数组的长度,但不是字符串中的字符数.

我找到了一个显示UTF-8字符串长度和字节长度的网站. https://mothereff.in/byte-counter 假设我的字符串是मेरानाम,那么我应该得到字符串长度为8个字符而不是22个字节.

任何人都可以请指导.

Joo*_*gen 6

最短的"长度"在Unicode 代码点中,作为编号字符UTF-32的概念.

在java 8中:

int length = (int) string.codePoints().count();
Run Code Online (Sandbox Code Playgroud)

以前的javas:

int length(String s) {
   int n = 0;
   for (int i = 0; i < s.length(); ++n) {
       int cp = s.codePointAt(i);
       i += Character.charCount(cp);
   }
   return n;
}
Run Code Online (Sandbox Code Playgroud)

Unicode代码点可以用UTF-16编码为一个或两个char.

相同的Unicode字符可能具有变音符号.它们可以写成单独的代码点:基本字母+零个或多个变音符号.要将字符串规范化为一个(C =)压缩代码点:

string = java.text.Normalizer.normalize(string, Normalizer.Form.NFC);
Run Code Online (Sandbox Code Playgroud)

BTW用于数据库目的,UTF-16长度似乎更有用:

string.length() // Number of UTF-16 chars, every char two bytes.
Run Code Online (Sandbox Code Playgroud)

(在示例中提到UTF-32长度== UTF-16长度.)


转储功能

评论者有一些意想不到的结果:

void dump(String s) {
   int n = 0;
   for (int i = 0; i < s.length(); ++n) {
       int cp = s.codePointAt(i);
       int bytes = Character.charCount(cp);
       i += bytes;
       System.out.printf("[%d] #%dB: U+%X = %s%n",
           n, bytes, cp, Character.getName(cp));
   }
   System.out.printf("Length:%d%n", n);
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*ant -1

只需将程序另存为utf-8\n 并执行以下操作

\n\n
        String str= "\xe0\xa4\xae\xe0\xa5\x87\xe0\xa4\xb0\xe0\xa4\xbe \xe0\xa4\xa8\xe0\xa4\xbe\xe0\xa4\xae";\n        System.out.println(str.length());\n
Run Code Online (Sandbox Code Playgroud)\n\n

欧/普 = 8

\n