在 PHP 中
echo mb_strlen('🌦')
结果是1
在 Android Java 中
"🌦".length()
结果是2
另一种编写相同字符/图标的方法
"\uD83C\uDF26".length()
结果是2
Android 编码
Charset defaultCharset = Charset.defaultCharset()
=> UTF=8
(new OutputStreamWriter(new ByteArrayOutputStream())).getEncoding()
=> UTF-8
文件编码为UTF-8。
问题
为什么 Android Java 显示的结果与 mb_strlen 不同?
我假设mb_strlen结果是正确的,长度是1。如何让Java理解字符串来计算长度为1?
LE:
问题是我有一个来自 PHP 服务器的字符串,如下所示: 长度|字符串... 例如:
5|juice3|aha3|yes
如果字符串包含 '🌦',例如
7|sample🌦3|yes
那么 Android Java 会将其计为 2 而不是 1,并且会错误地解析字符串
String.length()
返回字符串中 char
的数量(或 “Unicode 代码单元”)。 Java char
是 UTF-16,这意味着它需要两个 Unicode 代码单元来表示某些“Unicode 代码点”(在 UTF-16 中,大多数代码 units 也是代码 points,但并非所有代码点都可以用单个代码表示单位)。
String.codePointCount(int, int)
。例如,对于整个字符串中的码点数量:
someString.codePointCount(0, someString.length())