Java UTF-16转换为UTF-8

时间:2015-09-25 11:39:32

标签: java twitter encoding utf-8 character-encoding

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

1 个答案:

答案 0 :(得分:5)

你有一个长度为2的字符串 - 因为String属性返回UTF-16代码单元的数量,不是 Unicode字符的数量。请记住,Java中的length()实际上是一系列UTF-16代码单元,而不是一系列字符。

正如你所说,表情符号用代理对表示 - 它是U + 1F604,用UTF-16表示为U + D83D U + DE04。

如果您拨打String.codePointCount而不是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 } } ,则会获得1:

Uri uri;
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
    .setProgressiveRenderingEnabled(true)
    .build();
DraweeController controller = Fresco.newDraweeControllerBuilder()
    .setImageRequest(request)
    .setOldController(mSimpleDraweeView.getController())
    .build();
mSimpleDraweeView.setController(controller);

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