当前位置:  开发笔记 > 编程语言 > 正文

jsp utf编码

如何解决《jsputf编码》经验,为你挑选了1个好方法。

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

我正在为一所意大利大学开发一个网络工具,我必须显示带有重音的单词(例如è,ù,...); 有时我会从PostgreSql表(UTF8编码)中获取这些单词,但大多数情况下我必须从文件中读取长段落.这些文件编码为utf-8 xml,并在Smultron或任何utf-8编辑器中显示(它们是在python旧文件中使用实体è而不是"è" 进行解析).

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

String s = parseText(filename, position)

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

out.write(s)

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

String s = getWordFromPostgresql(...)

out.write(s)

在相同的jsp中它显示OK.

任何提示?

谢谢Nicola


@ krosenvold

感谢您的回复,但该指令已经在页面中,但它不起作用(实际上它"有效",但仅适用于我从数据库中获取的字符串).我认为有一些关于从文件中读取的内容,但我无法理解......它们在"java"中工作,但在"jsp"中却没有(不能想到更好的解释......)

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

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

    // ...
    Map map = TestoMarkParser.parseMarks(...);
    out.write(map.get(m));

这就是结果:

"Fuperòcosì"in il il Genere Enharmonico,che quelli quali vi si esercitavano,"

如果我在java类中放入相同的代码,并用System.out.println替换out.write,结果如下:

"Fuperiòcosìinuso il Genere Enharmonico,che quelli quali vi si esercitavano,"


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

原始字符串:"fuperò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 = `

krosenvold.. 15

在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服务器控制台窗口中正确的字符集(或者只是在调试器中停止并检查它).我怀疑你这样做时会看到不正确的字符,这让我相信你在构造字符串时会遇到编码问题.



1> krosenvold..:

在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服务器控制台窗口中正确的字符集(或者只是在调试器中停止并检查它).我怀疑你这样做时会看到不正确的字符,这让我相信你在构造字符串时会遇到编码问题.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有