步骤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个字符(代理对),这没有意义。
有人可以帮我吗?
答案 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创建字符串的事实与其内容完全无关。假设你的字符串与我上面的示例代码中的字符串相同,那么解码工作正常。