gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:59 26 4
gpt4 key购买 nike

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

String str = "मेरा नाम";
Charset UTF8_CHARSET = Charset.forName("UTF-8");
byte[] abc = str.getBytes(UTF8_CHARSET);
int length = abc.length;

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

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

谁能指导一下。

最佳答案

最短的“长度”是 Unicode 代码点,作为编号字符的概念,UTF-32。

更正:正如@liudongmiao 提到的,可能应该使用:

int length = string.codePointCount(0, string.length);

在 Java 8 中:

int length = (int) string.codePoints().count();

以前的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;
}

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

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

string = java.text.Normalizer.normalize(string, Normalizer.Form.NFC);

顺便说一句,对于数据库而言,UTF-16 长度似乎更有用:

string.length() // Number of UTF-16 chars, every char two bytes.

(在例子中提到的 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);
}

关于java - 在 Java/Android 中找出 UTF-8 字符串中的字符数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29726723/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com