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

时间:2010-02-03 10:28:23

标签: java encoding utf8-decode windows-1255

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

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

有什么想法吗?

更新

我正在创建的页面是一个需要设置为WIN-1255的RSS源,显示从另一个以UTF-8编码的源中获取的信息。

第二次更新:

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

亚当

5 个答案:

答案 0 :(得分:2)

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

你遇到这个问题的背景是完全不清楚的(请在未来的问题中详细说明),所以这里有几个解决方案:

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

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

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

response.setCharacterEncoding("WIN-1255");

通过自动隐式设置Content-Type响应头和charset参数的方式来指示客户端使用相同的编码来解释/显示页面。有关详细信息,另请参阅this article

如果它是依赖于基本java.net和/或java.io API的自行开发的应用程序,那么您需要通过使用{{3}构造的OutputStreamWriter来编写字符。您可以在其中指定编码:

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

答案 1 :(得分:1)

假设你已经控制了原始(正确表示的)字符串,只需要在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”))

答案 2 :(得分:0)

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

如果您可以提供有关系统如何工作的更多详细信息(生成网页的内容?它如何与Java程序交互?)那么它将使事情变得更加清晰。

答案 3 :(得分:0)

  

我正在创建的页面是一个需要设置为WIN-1255的RSS源,显示从另一个以UTF-8编码的源中获取的信息。

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

答案 4 :(得分:0)

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