3

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

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

有任何想法吗?

更新:

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

第二次更新:

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

亚当

4

5 回答 5

2

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

您遇到此问题的上下文完全不清楚(请在未来的此类问题中详细说明),因此这里有几个解决方案:

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

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

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

response.setCharacterEncoding("WIN-1255");

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

如果它是依赖于基本java.net和/或java.ioAPI 的本土应用程序,那么您需要通过使用构造函数构造的字符来编写字符,OutputStreamWriter该构造函数采用 2 个参数,您可以在其中指定编码:

Writer writer = new OutputStreamWriter(someOutputStream, "WIN-1255");
于 2010-02-03T12:06:40.343 回答
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"))

于 2010-02-03T10:39:48.733 回答
0

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

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

于 2010-02-03T10:35:12.627 回答
0

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

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

于 2010-02-03T11:00:07.360 回答
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
于 2010-02-03T11:13:54.687 回答