我正在调用一个错误的服务,告诉我下面的字符串存在编码问题:
的Universal®
据我所知,这个字符串是“utf8”编码的。这是对utf8编码的正确理解吗?如果是这样,这是否表明我应该删除utf8编码?如果是的话,有关如何在Java中对utf8字符串进行解码的任何建议吗?
或者我错了,上面的字符串不是utf8编码的?若然,有任何建议如何编码吗?
答案 0 :(得分:5)
Java如何存储字符串与在消息中编码字符串的方式相同。您可以尝试以下方式:
String s = "Universal®";
byte[] encoded = s.getBytes(Charset.forName("UTF-8"));
您必须抓住UnsupportedCharsetException
,但UTF-8是标准的可用字符集。
或者您可能需要在发送API中设置编码,例如在HTTP Content-Type: text/plain; charset=UTF-8
中。
答案 1 :(得分:2)
®
U + 00AE的“Universal®”不能用普通的7位ASCII表示,尽管它可以在其他几个字符集/编码中表示。通用Unicode编码UTF-8
可以混合任何脚本。
您需要在某些编码中转换为字节的文字才能说明其编码。
在java中,String在内部是Unicode,可以处理所有内容。
由于java源代码是免费的,因此它必须与java编译器javac使用的编码相同。但是,您可以使用u-escaping,使用ASCII来表示特殊符号(在UTF-16范围内):
String s = "Universal\u00AE";
byte[] bytes = s.getBytes(StandardCharsets.UTF_8);
String t = new String(bytes, StandardCharsets.UTF_8);
assert t.equals(s);
答案 2 :(得分:1)
从一般意义上讲,编码只是比特的分类和分配,用于表示字符串。有关更多详细信息,请参阅以下链接。通常,所有编码类型都可以相互转换,但是有一些例外。您可能已经看到了标记无法显示的符号的大空白正方形/等。这通常是由编码错误引起的(例如该编码方案不存在的字符)。
https://en.wikipedia.org/wiki/UTF-8
根据您的具体问题,列出的字符串应为UTF-8 Encodable。它可能已保存为其他编码类型(这可能会导致您的问题)。您总是可以尝试将其转换为UTF-8,看看会发生什么。
修改强> - 关于评论,我希望问题与在尝试通过服务(或服务)传输之前不正确编码有关。
答案 3 :(得分:-2)
快速浏览一下:http://www.utf8-chartable.de/(我们应该知道,不看,人们)表明@确实是一个utf8角色。所以,不知道什么框架抱怨它不是这样,但它是错误的