java - jsp utf编码

标签 java jsp encoding utf

我很难弄清楚如何处理这个问题:

我正在为一所意大利大学开发一个网络工具,我必须显示带有重音符号的单词(例如 è、ù、...);有时我从 PostgreSql 表(UTF8 编码)中得到这些词,但大多数情况下我必须从文件中读取很长的段落。这些文件被编码为 utf-8 xml,并在 Smultron 或任何 utf-8 编辑器中显示良好(它们是在 python 旧文件中创建的,具有诸如 è 而不是“è”之类的实体)。

我编写了一个 java 类,它从 xml 文件中提取相关段,其工作方式如下:

String s = parseText(文件名, 位置)

如果我将返回的字符串写入文件,一切看起来都很好;问题是如果我这样做

输出.write(s)

在 jsp 页面中,我得到了奇怪的字符。顺便说一句,我用

String s = getWordFromPostgresql(...)

输出.write(s)

在同一个 jsp 中,它显示 OK。

有什么提示吗?

谢谢 尼古拉


@ krosenvold

感谢您的回复,但是该指令已经在页面中,但它不起作用(实际上它“起作用”但仅适用于我从数据库中获取的字符串)。我认为有一些关于从文件中读取的东西,但我无法理解......它们在“java”中工作而不是在“jsp”中工作(想不出更好的解释......)

下面是从实际代码中提取的一个基本示例:从文件中读取的方法返回一个 Map,从 Mark(表示文本中位置的对象)到 String(包含文本):

这是在 .jsp 页面中(上面的帖子中引用了 utf 指令)

    // ...
    Map<Mark, String> map = TestoMarkParser.parseMarks(...);
    out.write(map.get(m));

这是结果:

“Fu per√≤ cos√¨ in uso il Genere Enharmonico, che quelli quali vi si esercitavano,”

如果我将相同的代码放在 java 类中,并将 out.write 替换为 System.out.println,结果是这样的:

“Fu però così in uso il Genere Enharmonico, che quelli quali vi si esercitavano,”


我一直在用十六进制编辑器做一些分析,这里是:

原始字符串:“fu però così”

ò 在 xml 文件中: C3 B2

ò 由 jsp 文件中的 out.write() 呈现: E2 88 9A E2 89 A4

ò 通过以下方式写入文件:

FileWriter w = new FileWriter(new File("out.txt"));
w.write(s);     // s is the parsed string
w.close();

C3 B2

将每个字符的值打印为一个 int

0: 70 = F
1: 117 = u
2: 32 =  
3: 112 = p
4: 101 = e
5: 114 = r
6: 8730 = � 
7: 8804 = � 
8: 32 =  
9: 99 = c
10: 111 = o
11: 115 = s
12: 8730 = �
13: 168 = �
14: 10 = `

最佳答案

在 jsp 页面指令中,您应该尝试将内容类型设置为 utf-8,这也会将 pageEncoding 设置为 utf-8。

<%@page contentType="text/html;charset=UTF-8"%>

UTF-8 不是 jsp 中的默认内容类型,由此产生了各种有趣的问题。问题是底层流默认被解释为 ISO-8859-1 流。如果您向该流写入一些 unicode 字节,它们将被解释为 ISO-8859-1。我发现将编码设置为 utf-8 是最好的解决方案。

编辑: 此外,Java 中的字符串 变量应该始终 是unicode。所以你应该总是能够说

System.out.println(myString) 

并在您的 Web 服务器的控制台窗口中查看正确的字符集(或者只是在调试器中停止并检查它)。我怀疑您在执行此操作时会看到不正确的字符,这使我相信您在构造字符串时遇到了编码问题。

关于java - jsp utf编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/488448/

相关文章:

c - 如何将 Windows 控制台输出代码页设置为 1252 以外的代码页?

java - DOM4J 解析不返回任何子节点

java - 如何识别postgresql数据库中类型 'text'的列中现有的换行符并将其显示在html/jsp页面上?

java - org.springframework.security.oauth 和 org.codehaus.spring-security-oauth 之间有什么区别?

jsp - Struts逻辑标签等于不工作

java - Servlet Controller - 带参数重定向

json - Node js : change csv file encoding programatically and parse to json

java - Android 多线程服务

javascript - 使用 Python 请求库发布到 .jsp 网站

java - 调试 ByteArrayOutputStream 字符串比较