扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在我编写带有中文字符的JSP文件时(如图2所示),看上去一切正常。我前面提到,屏幕上显示的所有字符都在内存中,与编码方式没有直接的关系。
在保存文件后,如果关闭IDE再重新打开,这些字符就显示为乱码(如图3所示),这是因为ISO-8859-1编码方式在存储中文字符时会丢失一些信息。
字符编码API
在servlet和JSP规范里有几个API用来控制J2EE应用的字符编码过程。对于servlet请求,setCharacterEncoding()方法对当前HTTP请求设定编码方式;对于servlet响应,setContentType()方法和setLocale()方法对HTTP响应输出设置Mime头的编码方式。
这些API本身不会引发问题,但如果你忘了用它们就有问题了。例如在有些服务器上你可以正确无误地显示多字节字符而不必在代码中使用上述的任何一个API,但在其它的服务器上运行应用时字符却变成了乱码。
多字节字符显示问题的成因在于服务器在处理HTTP请求和响应期间如何对字符进行编码。以下是服务器确定请求和响应的编码方式的规则,对大多数服务器都适用:
在处理servlet请求时,服务器按以下次序(自上而下)来确定请求的字符编码方式:
·代码中指定的设置
(如setCharacterEncoding()方法中指定的编码方式)
·厂商的初始设置
·默认的设置
在处理servlet响应时,服务器按以下次序(自上而下)来确定响应的字符编码方式:
·代码中指定的设置
(如setContentType() 方法和setLocale()方法中指定的编码方式)
·厂商的初始设置
·默认的设置
按照上述规则,如果在代码中用API进行了指定,所有的服务器都会按指定的字符编码方式编码,否则服务器就会各行其道。有些厂商用HTTP表单的隐藏字段(hidden fields)来确定请求的编码方式,还有些厂商则采用它们自己配置文件中的特定设置。
即使是默认设置也不尽相同,大多数厂商采用ISO-8859-1作为默认设置,还有少数厂商采用操作系统的本地设置值。因此,一些带有多字节字符的应用在迁移到另一个厂商的J2EE服务器上时就会出现显示问题。 |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者