代码之家  ›  专栏  ›  技术社区  ›  Adam Matan

网页中的Java字符串编码转换

  •  3
  • Adam Matan  · 技术社区  · 15 年前

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

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

    有什么想法吗?

    更新:

    我创建的页面是一个RSS提要,需要设置为win-1255,显示从另一个以utf-8编码的提要获取的信息。

    第二次更新:

    谢谢你的回复。我已经成功地转换了弦,但是,乱说。问题是除了头编码之外,还应该设置XML编码。

    亚当

    5 回复  |  直到 12 年前
        1
  •  2
  •   BalusC    12 年前

    到目前为止,您需要设置 响应编写器 .只有一个响应头,您基本上只是指示客户机应用程序使用哪种编码来解释/显示页面。如果响应本身是用不同的编码编写的,那么这将不起作用。

    您遇到这个问题的背景是完全不清楚的(请详细说明它以及将来遇到的类似问题),因此这里有几个解决方案:

    如果是jsp,则需要在jsp顶部设置以下内容来设置响应编码:

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

    如果是servlet,则需要在第一次刷新之前设置以下内容以设置响应编码:

    response.setCharacterEncoding("WIN-1255");
    

    两者都自动地隐式地设置 Content-Type 响应头 charset 参数,指示客户端使用相同的编码来解释/显示页面。也看到 this article 更多信息。

    如果它是依赖基本 java.net 和/或 java.io API的,则需要通过 OutputStreamWriter 它是用 the constructor taking 2 arguments 其中可以指定编码:

    Writer writer = new OutputStreamWriter(someOutputStream, "WIN-1255");
    
        2
  •  1
  •   Matthew Flaschen    15 年前

    假设您控制了原始(正确表示的)字符串,并且只需要在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做什么取决于你的环境。例如,如果您使用servlets,则可以执行以下操作:

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

    我们也不应忽视打电话的可能方法 setContentType("text/html; charset=windows-1255") ( setContentType ),然后使用 getWriter 正常情况下。您没有完全清楚Windows-1255是在元标记中还是在HTTP响应头中设置的。

    您澄清了您有一个需要解码的UTF-8文件。如果您还没有正确地解码UTF-8字符串,这应该没什么大不了的。只要看看 InputStreamReader (someinputstream,charset.forname(“utf-8”))

        3
  •  0
  •   Jon Skeet    15 年前

    在页面中嵌入数据是什么?或者它应该作为文本读取(在UTF-8中),然后再在网页的编码(WE1255)中再写出来,或者你应该改变Java程序来创建WE1255中的文件(或者任何东西)。

    如果你能提供更多关于系统工作原理的细节(什么是生成网页的?它是如何与Java程序交互的?这样会让事情更清楚。

        4
  •  0
  •   McDowell rahul gupta    15 年前

    我创建的页面是一个RSS提要,需要设置为win-1255,显示从另一个以utf-8编码的提要获取的信息。

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

        5
  •  0
  •   josefx    15 年前
    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
    
    推荐文章