【问题标题】:JAVA :: Garbage characters encodingJAVA :: 垃圾字符编码
【发布时间】:2013-10-01 21:41:06
【问题描述】:

我从网上收到乱码字符串 ("किसानोà¤, के लà¤),我想将其转换为JAVA 中的印地语。我尝试过以下代码,但不知何故无法正常工作,

         s = new String(str.getBytes("ISO-8859-1"), "UTF-8");

它显示的印地语字符很少,但不是全部。它显示奇怪的字符,如 � 和 ?。

请帮我解决这个问题。

【问题讨论】:

  • 什么是str?您来自网络的乱码字符串应该以字节形式出现,您可以将其转换为具有正确编码的字符串。
  • 你试过其他编码吗?您可以循环尝试所有这些,看看哪个是正确的。
  • 垃圾字符?请致电System.gc();,然后重试。
  • 嗨彼得,我不知道如何检查所有编码?我是Java新手,所以没有太多想法。你能推荐点什么吗?
  • 我检查了所有编码,但似乎没有任何工作正常。

标签: java unicode character-encoding


【解决方案1】:

新字符串(str.getBytes("ISO-8859-1"), "UTF-8");

这是试图恢复一个被错误解码为 ISO-8859-1 的字符串,而它实际上是 UTF-8。

但是,如果您谈论的是网页,那么您可能没有 ISO-8859-1,您可能有 Windows 代码页 1252,一种类似于 ISO-8859-1 的编码,但在字节范围 0x80–0x9F。如果您将上面代码中的ISO-8859-1 替换为windows-1252,您的示例文本会显示为:

किसानों के ल�

这似乎更接近正确(只是被截断)。

不过,一般来说,要避免尝试恢复解码错误的字符串。对于许多编码组合,错误解码可能会导致不可恢复的重整。首先使用正确的编码从原始字节解码字符串要好得多。你如何做到这一点取决于你从哪里得到str

【讨论】:

  • 我从 google feed api 获取 str。我对 google feed api 进行了 $.ajax 调用,它成功向我发送了数据,但数据包含所有字符,例如 ("किसानों ठ•े लà¤)。我想把它转换成应有的印地语。
  • 嗨 bobince - 我尝试了你的建议,看起来还有几个印地语字符出现了,但仍然有一些垃圾字符 (�)。还有什么建议吗?
  • 根据str 最初的解码方式,它可能会被不可挽回地损坏。你需要回去看看str 是如何收集的,因为真正的修复应该在那里完成。
  • bobince - 就像我说的数据来自 google feed api 并且没有提供有关 google api 结果集格式的帮助。
  • 好的,这是 Google RSS API 中的一个错误:当它获取的提要的内容类型为 text/xml(没有 charset=)时,它会猜测(错误)编码,当实际上 XML 的默认编码应该是 UTF-8。直接浏览ajax.googleapis.com/ajax/services/feed/…就可以看到这个问题。 Google 需要解决这个问题。
【解决方案2】:

您可以在 web.xml 中对您的 tomcat 的过滤器编码进行一些更改,并在 server.xml 中修改连接器,而不是转换乱码字符串。以下是条目。这将在 tomcat 级别更改字符编码,您将获得通过 javascript 传递的确切字符。

web.xml

<filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter>
 <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

服务器.xml

在连接器标签中

<Connector port="8080" protocol="HTTP/1.1" 
.. 
..
URIEncoding="UTF-8" useBodyEncodingForURI="true" />

【讨论】: