Java UTF-16转换为UTF-8

vid*_*dzi 2 java twitter encoding utf-8 character-encoding

步骤1:使用HttpClient到Twitter端点进行REST调用,并获取包含表情符号的推文消息.Twitter API返回UTF-8编码的字符串.
示例:Message =;
第2步:我使用Java来读取字符串,使用InputStreamReader和charset UTF-8.仍然,字符串的长度变为2,而不是1.
当我使用UTF-8?明确解析它时,这怎么可能?
在网上我找到了几个资源,其中提到表情符号是高码点字符,因此java认为它是2个字符(代理对),这没有意义.
有人可以帮我吗?

Jon*_*eet 5

你有一个长度为2的字符串 - 因为该length()属性返回UTF-16代码单元的数量,而不是 Unicode字符的数量.请记住,StringJava中的一个实际上是一系列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
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您通过解码UTF-8创建字符串的事实与其内容完全无关.假设你的字符串与我上面的示例代码中的字符串相同,那么解码工作正常.