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

Jan*_*nak 8 java encoding utf-8 utf character-encoding

我从Jersey Web Service获取参数值作为参数,该服务是Japaneses字符.

这里,'japaneseString'是包含日语字符的web服务参数.

   String name = new String(japaneseString.getBytes(), "UTF-8");
Run Code Online (Sandbox Code Playgroud)

但是,我能够成功转换一些sting文字,而其中一些文字会产生问题.

以下成功转换:

 1) ????
 2) ?
 3) ???????????????
 4) ????
Run Code Online (Sandbox Code Playgroud)

虽然这些不是:

 1) ??????
 2) ????
Run Code Online (Sandbox Code Playgroud)

当我进一步调查时,我发现这两个字符串正在转换为一些JUNK字符.

 1) Input: ??????        Output : ?????????????
 2) Input: ????            Output: ??????
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

fge*_*fge 9

你在这里混合概念.

A String只是一系列字符char; a String本身根本没有编码.对于它的价值,用characters上面的替换carrier pigeons.一样.载体鸽没有编码.也没有char.(1)

你在这做什么:

new String(x.getBytes(), "UTF-8")
Run Code Online (Sandbox Code Playgroud)

是一个"穷人的编码/解码过程".您可能已经注意到有两个版本.getBytes():一个是将charset作为参数传递,另一个是不传递的.

如果你不这样做,那就是这里发生的事情,这意味着你将使用你的默认字符集获得编码过程的结果; 然后尝试使用UTF-8重新解码此字节序列.

不要那样做.只需要接收字符串.但是,如果您在将原始字节流读入字符串时遇到问题,则意味着您使用了Reader错误的字符集.修复部分.

有关更多信息,请阅读此链接.

(1)事实上,a char是UTF-16代码单元与此讨论无关

  • @Nitul再次阅读答案; 一个字符串根本没有解码或编码的概念; 您只将char序列编码为字节序列,并将字节序列解码为char序列.最初的问题(如果有的话)是OP无法正确_decode_字节序列. (3认同)
  • @Nitul UTF-8是一种编码!您不会将字符串_decode为UTF-8_.字符串是一个简单的char数组,而字符没有任何固有的编码.字符只是指向字符表的值.编码用于将该字符(字符的值)存储为一个或多个字节.没有其他的.解码过程恰恰相反:根据使用的编码获取一些字节并创建字符. (2认同)

Nit*_*tul 4

尝试在 Tomcat(JVM) 启动时将 JVM 参数 file.encoding 设置为 UTF-8 值。例如:-Dfile.encoding=UTF-8