Java字符串编码转换为UTF-8

3
我有一些HTML代码存储在Java.lang.String变量中。我将该变量写入文件并在将字符串变量的内容写入文件系统时设置编码为UTF-8。打开该文件时,所有内容看起来都很好,例如 → 显示为右箭头。
但是,如果同样的字符串(包含相同的内容)被JSP页面用于呈现浏览器中的内容,则诸如 → 的字符会显示为问号(?)。
在将内容存储在字符串变量中时,我确保使用:
String myStr = new String(bytes[], charset)  

不仅仅是:

String myStr = "<html><head/><body>&rarr;</body></html>";

请问有人能告诉我为什么字符串内容可以完美地写入文件系统,但在JSP/浏览器中无法呈现吗?

谢谢。


1
看起来您在页面头部没有正确指定“字符集”。尝试在浏览器中将编码更改为UTF-8。 - Ivan Nevostruev
1
你不应该在浏览器中更改编码。相反,你应该通过设置响应编码来指示浏览器使用正确的编码。 - BalusC
如果像你之前的评论所暗示的那样,在服务器端你无法正确地看到这些字符,那么下一步要检查的是如何获取该字节数组。你是在读取文件吗?你设置了编码吗?我默认字符集为“UTF-8”。 - Yishai
我有一个类,它生成 HTML 代码并将其存储在字符串变量中。HTML 代码首先存储在一个字符串中(未定义编码),然后我从该字符串获取 byte[],创建一个新的字符串变量,将 byte[] 与正确的编码一起传递给新的字符串变量。 - m_a_khan
那个将double转换为String的过程是完全不必要的。String在内部以16位unicode形式存储其状态,你所做的只是一个字节数组的转换。假设你使用"UTF-8"作为编码调用了getBytes()方法(如果没有,那就是你的问题),让我们关注第一个字符串。你是如何生成它的?你是从任何二进制源(文件、字节数组或其他)中读取的吗?更重要的是为什么?这就是JSP为你做的事情。 - Yishai
3个回答

4

但是在jsp/浏览器中没有呈现出来?

您还需要设置响应编码。在JSP中,您可以使用以下代码来完成:

<%@ page pageEncoding="UTF-8" %>

这实际上与在HTML的<head>中设置以下元标记具有相同的效果:
<meta http-equiv="content-type" content="text/html; charset=utf-8">

当我尝试使用System.out.println(...)在控制台上打印Java字符串变量的内容时,我看到的是"?"而不是正确的箭头,所以我的猜测是JSP得到了问号,这就是为什么它在浏览器中显示问号的原因。我认为问题出在我的Java代码中,也许我需要以其他方式指定字符串内容的编码。 - m_a_khan
1
然后控制台也应该配置为使用UTF-8。您可以在此处找到更多背景信息和详细解决方案:http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html 希望这有所帮助。 - BalusC

1
可能性:
  1. 浏览器不支持UTF-8
  2. 您的HTTP头中没有Content-Type: text/html; charset=utf-8

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接