第 1 步:使用 HttpClient 对 Twitter 端点进行 REST 调用并获取包含表情符号的推文消息。 Twitter API 返回 UTF-8 编码的字符串。
示例:消息 = 😄;
第 2 步:我使用 Java 读取字符串,使用 InputStreamReader,字符集 UTF-8
。尽管如此,字符串的长度还是 2,而不是 1。
当我使用 UTF-8
明确解析它时,这怎么可能?
在网上我找到了几个资源,其中提到表情符号是高代码点字符,因此 java 认为它是 2 个字符(代理对),这是没有意义的。
有人可以帮我吗?
最佳答案
您有一个长度为 2 的字符串 - 因为 length()
属性返回 UTF-16 代码单元的数量,而不是Unicode 字符的数量。请记住,Java 中的 String
实际上是 UTF-16 代码单元序列,而不是字符序列。
正如您所说,该表情符号用代理对表示 - 它是 U+1F604,在 UTF-16 中表示为 U+D83D U+DE04。
如果您调用 String.codePointCount
而不是 length()
,你会得到 1:
public class Test {
public static void main(String[] args) {
String emoji = "\ud83d\ude04";
System.out.println(emoji.length()); // 2
System.out.println(emoji.codePointCount(0, emoji.length())); // 1
}
}
请注意,您通过解码 UTF-8 创建字符串这一事实与其内容完全无关。假设您得到的字符串与我上面示例代码中的字符串相同,则解码工作正常。
关于Java UTF-16 到 UTF-8 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32781368/