Redian新闻
>
一个想不明白的编码问题
avatar
一个想不明白的编码问题# Java - 爪哇娇娃
g*r
1
IM做的好是干不掉360的, 除非马化腾他爸爸是习近平
同理, 360想干掉腾讯也得它能做IM才成
avatar
b*g
2
这两天用到一个servlet, 需要处理中文的,所有的编码都用的utf8, 没什么问题,可是
今天没事play with it的时候,发现下面这一段:
String inputText = request.getParameter("input");
String modText = new String(inputText.getBytes("ISO-8859-1"), "UTF-8")
;
myPrintWriter.println(modText);
基本上就是读入输入的中文,然后原样打印出来。但是我发现,其中第二句不管加上还是
去掉,在网页上显示的都是正确的中文。ISO-8859-1应该是只支持拉丁字母的
characterset, 所以inputText.getBytes("ISO-8859")这个操作应该会丢失inputText本
来来储存的中文信息,因为在8859-1的characterset里map不到,这样即使再用utf-8转回
来,也不应该是原来的信息了。可是为什么在我的test里面,不管有没有这句都没有区别
呢。bt
avatar
t*5
3
check javadoc of getBytes()
'the behavior is undefined' if string is beyond the charset.
the impl happens to decide just returning all the damn bytes.


")




【在 b***g 的大作中提到】
: 这两天用到一个servlet, 需要处理中文的,所有的编码都用的utf8, 没什么问题,可是
: 今天没事play with it的时候,发现下面这一段:
: String inputText = request.getParameter("input");
: String modText = new String(inputText.getBytes("ISO-8859-1"), "UTF-8")
: ;
: myPrintWriter.println(modText);
: 基本上就是读入输入的中文,然后原样打印出来。但是我发现,其中第二句不管加上还是
: 去掉,在网页上显示的都是正确的中文。ISO-8859-1应该是只支持拉丁字母的
: characterset, 所以inputText.getBytes("ISO-8859")这个操作应该会丢失inputText本
: 来来储存的中文信息,因为在8859-1的characterset里map不到,这样即使再用utf-8转回

avatar
b*g
4
Thanks for the help. 今天又作了一些测试,结果发现了更多的问题,原来这个
String modText = new String(inputText.getBytes("ISO-8859-1"), "UTF-8");
是起作用的,如果不加这句,存进database就是乱码,加了这句,才能正常存储中文。
servlet 相关的命令如下:
request.setCharacterEncoding("UTF-8");
...
String inputText = request.getParameter("input");
String modText = new String(inputTextgetBytes("ISO-8859-1"), "UTF-8");
...
save to database
如果去掉转变编码的那一句,就不能正确存储. 可是我的jsp的content type 设的是
charset="UTF-8", request也设成了UTF-8, 为什么还需要用8859-1转化呢,真是百思不
得其解。难道是tomcat的bug?
")


avatar
t*5
5
in that case, my theory is that your browser sends in GB, and can
dispay GB, regardless of chartset specification.
you can not rely on a browser to check the bytes, look into HTTP
traffic directly to see what is sent between server and browser.
last time I know, it's a mess how browsers encode/escape request data.
lots of ambiguities, there is no way on server to interprete it
100% correctly. (yeah there are standards defining how it *shoud* be, but...

【在 b***g 的大作中提到】
: Thanks for the help. 今天又作了一些测试,结果发现了更多的问题,原来这个
: String modText = new String(inputText.getBytes("ISO-8859-1"), "UTF-8");
: 是起作用的,如果不加这句,存进database就是乱码,加了这句,才能正常存储中文。
: servlet 相关的命令如下:
: request.setCharacterEncoding("UTF-8");
: ...
: String inputText = request.getParameter("input");
: String modText = new String(inputTextgetBytes("ISO-8859-1"), "UTF-8");
: ...
: save to database

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。