中文乱码问题和国际化

来源:互联网 发布:僵尸病毒 知乎 编辑:程序博客网 时间:2024/04/29 23:30

中文乱码问题

 

1、以post方式提交由中文字符的表单

在调用request.getParameter("")前,先调用request.setCharacterEncoding("GBK"),明确指出

编码方式,在向浏览器输出前调用response.setContenType("text/html;charset=GBK");

<%@ page contentType="text/html;charset=GBK" %>

 

2、以get方式提交

此时需要自己转码:

String value = request.getParameter("name");

value= new String(value.getByte("ISO-8859-1"),"GBK");

 

3、在数据库中存储中文字符

数据库一般默认的编码方式是ISO-8859-1,所以在讲中文存入到数据前,先要自己转码,取出后在解码

 

4、Servlet/jsp

 

在jsp文件中<%@page pageEncoding="GBK" %>

 <%@ page contentType="text/html;charset=GBK" %>

 

可以用过滤器解决乱码问题

 

让tomcat支持中文文件名

在conf/server.xml文件中,在<Connector>元素添加URLEncoding属性,并将其值设置为"UTF-8"

如果调用response.sendRedirect()到中文文件名的页面,需要

response.sendRedirect(java.net.URLEncoding.encode("员工信息.html","UTF-8"));

 

 

国际化和本地化

国际化只要由两个类完成:Locale和ResourceBundle

 

Locale(String language)

Locale(String language,String country)

为了简化Locale对象的构造,Locale类中定义了许多Locale对象常量

Locale.CANADA,Locale.CHINA(对应国家)Locale.CHINESE,Locale.ENGLISH(对应语言)

getDefault()获取本地默认的Locale对象

getAvailableLocales(),获取java支持的所有语言环境

资源包,必须扩展ResourcBundle

不同语言对应的资源包为名称的基名加上ISO-639标准的语言代码,如myresource_en

获取资源包,调用

public static final ResourceBundle getBundle(String baseName),使用默认的Locale获取资源包

public static final ResourceBundle getBundle(String baseName,Locale locale)

public static final String getString(String key)获取资源包中key对应的内容

 

ResourceBundle有两个派生类:ListResourceBundle和PropertyResourceBundle,

 

PropertyResourceBundle,我们不需要直接使用它。

可以用native2ascii

 

消息格式化

在资源文件中的消息文本可以带参数:

greeting={0},欢迎你

花括号中的数字为一个占位符,可以使用0~9的数字,所以消息文本中的参数最多有10个,替换占位符,

可以使用java.text.MessageFormat format();

greeting={0},欢迎你。今天是{1}

Locale l = Locale.getDefault();

ResourceBundle rb = ResourcBundle.getBundle("myResource",l);

String str = rb.getString("greeting");

String msg = MessageFormat.format(str,"zhangsan","new Date()");

format参数的顺序与占位符的数字对应

 

 

 

 

原创粉丝点击