【问题标题】:Java string encoding conversion within a webpage网页内的 Java 字符串编码转换
【发布时间】:2010-02-03 10:28:22
【问题描述】:

我有一个(通过其标题)编码为WIN-1255 的网页。 Java 程序会创建自动嵌入到页面中的文本字符串。问题是原始字符串以 UTF-8 编码,从而在页面中创建了乱码文本字段。

很遗憾,我无法更改页面编码 - 这是客户专有系统所要求的。

有什么想法吗?

更新:

我正在创建的页面是一个 RSS 提要,需要将其设置为 WIN-1255,显示来自另一个以 UTF-8 编码的提要的信息。

第二次更新:

感谢所有回复。我已经设法转换了字符串,但是,乱码。问题是除了标头编码之外,还应设置 XML 编码。

亚当

【问题讨论】:

    标签: java encoding utf8-decode windows-1255


    【解决方案1】:

    说到点子上,你需要设置response writer的编码。只有一个响应标头,您基本上只是指示客户端应用程序使用哪种编码来解释/显示页面。如果响应本身是用不同的编码编写的,这将不起作用。

    您遇到此问题的背景完全不清楚(请在以后的此类问题中详细说明),因此这里有几个解决方案:

    如果是JSP,需要在JSP上面设置如下设置响应编码:

    <%@ page pageEncoding="WIN-1255" %>
    

    如果是Servlet,需要在任何第一次flush前设置如下设置响应编码:

    response.setCharacterEncoding("WIN-1255");
    

    顺便说一句,自动隐式设置带有charset 参数的Content-Type 响应标头,以指示客户端使用相同的编码来解释/显示页面。另请参阅this article 了解更多信息。

    如果它是依赖于基本java.net 和/或java.io API 的本土应用程序,那么您需要通过使用the constructor taking 2 arguments 构造的OutputStreamWriter 写入字符,您可以在其中指定编码:

    Writer writer = new OutputStreamWriter(someOutputStream, "WIN-1255");
    

    【讨论】:

      【解决方案2】:

      假设您可以控制原始(正确表示的)字符串,并且只需要在 win-1255 中输出它们:

      import java.nio.charset.*;
      import java.nio.*;
      Charset win1255 = Charset.forName("windows-1255");
      ByteBuffer bb = win1255.encode(someString);
      byte[] ba = new byte[bb.limit()];
      

      然后,简单的把ba的内容写在合适的地方。

      编辑:你用 ba 做什么取决于你的环境。例如,如果您使用 servlet,您可能会这样做:

      ServletOutputStream os = ...
      os.write(ba);
      

      我们也不应该忽略调用setContentType("text/html; charset=windows-1255")setContentType),然后正常使用getWriter的可能方法。您没有完全清楚是否在元标记或 HTTP 响应标头中设置了 windows-1255。

      您澄清说您有一个需要解码的 UTF-8 文件。如果您还没有正确解码 UTF-8 字符串,这应该没什么大不了的。看看InputStreamReader(someInputStream, Charset.forName("utf-8"))

      【讨论】:

      • 谢谢!我现在应该如何处理字节数组? ba[i] 是一个整数,我这里需要一些表示转换。
      【解决方案3】:

      页面中嵌入的数据是什么?它应该将其读取为文本(以 UTF-8 格式),然后以网页的编码(Win-1255)再次将其写出,或者您应该更改 Java 程序以在 Win-1255 中创建文件(或其他)以启动与。

      如果你能提供更多关于系统如何工作的细节(什么生成网页?它如何与 Java 程序交互?),那么事情就会清楚很多。

      【讨论】:

      • 我真的希望我能做到这一点,但问题是我得到了 UTF-8 中的字符串,并且必须将整个页面作为 WIN-1255 传递。将更新我的答案。
      • @Adam:“我得到了 UTF-8 字符串”到底是什么意思?你还没有解释系统是如何工作的。如果您在 Java 中有一个包含正确数据的字符串,那么它本身就没有 编码(或者更确切地说,它始终是 UTF-16)。但是我们不知道您是否已经使用 Java 获得了整个系统,或者什么...
      • 抱歉,我会尽量澄清。 1.我知道原始字符串表示应该是无关紧要的,但我试图给出一些背景。 2.问题可以概括为“如何创建带有WIN-1255字符串的RSS提要页面”。感谢您的帮助。
      • @Adam:再一次,我们需要知道服务器配置是什么样的。什么是生成页面?这是一个 JSP、一个 servlet 还是别的什么?
      • 问题已解决(请参阅我的答案中的另一个更新)。服务器再次位于我的生产团队外部,我对此知之甚少。
      【解决方案4】:

      我正在创建的页面是一个 RSS 提要,需要将其设置为 WIN-1255,显示来自另一个以 UTF-8 编码的提要的信息。

      在这种情况下,使用解析器加载 UTF-8 XML。这应该将数据正确解码为 UTF-16 字符数据(Java 字符串始终为 UTF-16)。您的输出机制应从 UTF-16 编码为 Windows-1255。

      【讨论】:

        【解决方案5】:
        byte[] originalUtf8;//Here input
        
        //utf-8 to java String:
        String internal = new String(originalUtf8,Charset.forName("utf-8");
        //java string to w1255 String
        byte[] win1255 = internal.getBytes(Charset.forName("cp1255"));
        
        //Here output
        

        【讨论】:

        • +1 谢谢!它很有见地,但对于我目前的需求来说有点太复杂了。
        猜你喜欢
        • 2013-08-22
        • 1970-01-01
        • 2010-10-21
        • 2017-06-27
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 2014-12-01
        • 1970-01-01
        相关资源
        最近更新 更多