我从 Jersey Web服务获取参数值,该参数值是日语字符。
此处,' japaneseString' 是包含日语字符的网络服务参数。
String name = new String(japaneseString.getBytes(), "UTF-8");
但是,我能够成功转换一些sting文字,而其中一些文字会产生问题。
以下内容已成功转换:
1) アップル
2) 赤
3) 世丕且且世两上与丑万丣丕且丗丕
4) 世世丗丈
虽然这些din:
1) ひほわれよう
2) 存在する
当我进一步调查时,我发现这两个字符串被转换为一些JUNK字符。
1) Input: ひほわれよう Output : �?��?��?れよ�?�
2) Input: 存在する Output: 存在�?�る
知道为什么有些日文字符没有正确转换?
感谢。
答案 0 :(得分:9)
你在这里混合概念。
String
只是一系列字符(char
s); String
本身根本没有编码。对于它的价值,请将上面的characters
替换为carrier pigeons
。一样。载体鸽没有编码。 char
也不是。new String(x.getBytes(), "UTF-8")
。 (1)
你在这做什么:
.getBytes()
是“穷人的编码/解码过程”。您可能已经注意到Reader
有两个版本:一个是将charset作为参数传递而另一个是不传递的。
如果你不这样做,那就是这里发生的事情,这意味着你将使用你的默认字符集获得编码过程的结果;然后尝试使用UTF-8重新解码此字节序列。
不要那样做。只需要接收字符串。但是,如果您在将原始字节流读入字符串时遇到问题,则意味着您使用错误的字符集char
。修复那个部分。
有关详情,请参阅this link。
(1)事实上,{{1}}是UTF-16代码单元与此讨论无关
答案 1 :(得分:4)
尝试使用JVM参数file.encoding在Tomcat(JVM)启动时使用值UTF-8进行设置。 E.x。: - Dfile.encoding = UTF-8
答案 2 :(得分:2)
我同意@fge。
<强> 澄清 强>
在java String/char/Reader/Writer
句柄(Unicode)文本中,可以组合世界上的所有脚本。
byte[]/InputStream/OutputStream
是二进制数据,需要指示某些编码转换为String。
在您的情况下,japaneseStingr
应该已经是正确的字符串,或者被原来的byte[]
替换。
Java中的陷阱
编码通常是一个可选参数,然后默认为平台编码。你也陷入了这个陷阱:
String s = "...";
byte[] b = s.getBytes(); // Platform encoding, non-portable.
byte[] b = s.getBytes("UTF-8"); // Explicit
byte[] b = s.getBytes(StandardCharsets.UTF_8); // Explicit,
// better (for UTF-8, ISO-8859-1)
通常避免使用没有编码参数的重载方法,因为它们仅适用于当前计算机数据:非可移植。为了完整性:应避免使用类FileReader / FileWriter,因为它们甚至不提供编码参数。
<强> 错误 强>
japaneseString
已经错了。所以你必须正确阅读。
它可能被错误地读取为Windows-1252(Windows Latin-1)并且在重新编码为UTF-8时遭受了损失。显然只有一些案件搞砸了。
也许你有:
String japanesString = new String(bytes);
而不是:
String japanesString = new String(bytes, StandardCharsets.UTF_8);
最后:
String name = japaneseString;
显示阅读japaneseString的代码以获取进一步的帮助。