Java编译器在对源文件编译前会先把源文件转换为unicode编码因为这个原因我们在编译时一定要把源文件用的是什么编码方式正确无误的告诉编译器
例如我们的源文件是以UTF的方式保存的而在编译时编译器却把它当作是用GBK方式保存的这样编译器就会按照GBK>Unicode的编码转换方法对源文件进行转换然后再编译这样当然会出错实际上编译器应当按照UTF>Unicode的编码转换方法来对源文件进行转换
a.对于控制台程序编译器会把源文件看作是由系统默认的编码类型来编码的(系统默认的编码类型取决于在控制面板区域设置里的配置中文wink下通常是GBK)也可以使用encoding参数来设置如javac encoding UTF这样编译器就会把源文件看作是用UTF编码的(这只是告诉编译器源文件的编码类型而不是对源文件转码)在各种语言的平台上只要在编译用时encoding指定与源文件的编码相同的编码方式就不会存在国际化的问题了
b.对于JSP编译器则会根据设定的字符集来判断JSP文件使用的是什么编码方式进而将其转换成unicode后进行编译若JSP中未指定编译器则会把JSP文件看作是按照系统默认的编码来保存的在JSP里新增了一个指令来通知编译器这个源文件所使用的编码方式
在处理输入输出时注意设置输入流和输出流的编码类型与用户输入时和输出设备显示时采用的编码方式一致
由于JRE在处理输入输出时会将输入或输出的内容进行编码转换对于输入会转换为unicode后再送入因此要正确的匹配实际输入内容的编码方式和告知JRE的编码方式对于输出会由unicode转换为其他的编码再送出程序因此要正确匹配输出设备显示时用的编码方式和告知JRE的编码方式
例如程序中设置输入流的编码是newInputStreamReader(SysteminGB)而程序运行后用户输入时用了繁体中文的输入法输入了BIG编码的内容这样JRE把BIG编码的内容当作GB的进行了GB>unicode的编码转换这样转换后的结果显然不是用户想要输入的内容了
默认情况下JRE会把输入输出的内容当作是按照系统默认编码方式编码的
在Servlet中除了一定要把源文件用的是什么编码方式正确无误的告诉编译器外还要注意实际提交的URL数据表单数据的编码格式和request中声明的编码格式一致
客户端浏览器在通过表单和URL提交数据时容器和JVM会将request中的数据看作是按照request所声明的编码方式来编码的将数据由这种编码方式转换为unicode后再送入servlet(实际上容器会先将request中的数据转为一种中间编码方式具体根据容器的配置而定再由JVM由这种中间方式转换为unicode通常这种中间格式是ISO)servlet输出的unicode数据会由容器根据response中声明的编码方式进行转换再送到客户端浏览器上
在接收客户端输入时用requestsetCharacterEncoding()声明请求中数据的编码方式
在向客户端输出时用responsesetContentType(text/html;charset=)声明响应的数据的编码方式告知浏览器以哪种编码方式显示
在JSP中由于JSP本就会被JSP编译器编译为servlet来运行因此情况与servlet相同
这两个JSP指令声明了请求和响应的编码方式
只要确保URL参数或表单中数据的编码方式和所声明的编码方式一致再通过告知JSP编译器本JSP文件采用的编码方式及含有哪种字符即可解决JSP的字符编码问题