Java UTF-16 到 UTF-8 的转换

标签 java twitter encoding utf-8 character-encoding

第 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/

相关文章:

Java - 我应该加密/解密我的套接字通信吗?

twitter - Tweepy 错误 104 : Connection aborted

java - 如何使用 TwitterObjectFactory.jsonStoreEnabled 获取 JSON 格式的推文?

css - 无法在同一行显示 Google+ 和 Facebook Like

encoding - 操作系统如何知道文件的编码

java - 使用 Java 有条件地访问同一级别的 JsonElements

Java Google Cloud Storage 上传媒体链接为空,但图片上传

ruby-on-rails - 奇怪的字符编码问题

java - 在每个方法的开头和结尾执行命令(Java 和/或 C++)

c# - 为什么 Encoding.ASCII != ASCIIEncoding.Default 在 C# 中?