UTF-8编码;只有一些日文字符没有被转换

时间:2014-06-03 07:13:15

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

我从 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: 存在�?�る

知道为什么有些日文字符没有正确转换?

感谢。

3 个答案:

答案 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的代码以获取进一步的帮助。