Java字符编码总结

文章的内容是我通过看其他文章后摘抄和总结的,如有雷同,一定是抄的。

1 编码简介
1.1 ASCII/ISO-8859-1/Latin_1
单字节编码,可以表示256个不同的字符(英文字符、标点符号等)。


1.2 GB2312/GBK
双字节编码(不定长,英文时只用一个字节),兼容ISO-8859-1编码,即当其为ISO-8859-1时,只需用一个字节来表示,并且其值完全一样。GB2312只能表示简体字,GBK可以同时表示繁体字和简体字,并且兼容GB2312。


1.3 Unicode
定长双字节编码,不兼容任何编码,但可通过转换,表示任何编码。Java内部使用Unicode来进行操作。不过Unicode容易占用更多的空间,因为对于英文字母,Unicode也需要两个字节来表示。


1.4 UTF(UCS Transformation Format)
不定长编码,每一个字符的长度从1-6个字节不等,一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。其实UTF就是Unicode编码的传输和存储的格式。

2 Java对字符的处理


2.1 getBytes(charset)
将字符串所表示的字符按照charset编码,并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。比如"中文",存储为"4e2d 6587",如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4"。如果charset为"utf8"则最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。(应先考虑字符串所表示的字符编码,然后确定需转换的编码与现在字符串的编码是否兼容


2.2 new String(charset)
将字节数组按照charset编码进行组合识别,最后转换为unicode存储。就是按照不同的编码,取不同的字节数,然后转换成unicode

3 Java中各类型操作的字符处理

 

3.1 各类型处理

 

Java字符编码处理

 

3.2 文件读写
外部数据如文件经过读写转换两个步骤,转为jvm所使用字符。
1. InputStream/OutputStream用于读写原始外部数据,Reader/Writer执行读写和转换两个步骤,处理汉字不合适,应该首选使用Reader/Writer。
2. FileReader/FileWriter使用JVM当前编码读写文件.如果有其它编码格式,使用InputStreamReader/OutputStreamWriter
3. PrintStream有点特殊,它自动使用jvm缺省编码进行转换。


3.3 读取.properties文件
.propeties文件由Properties类以iso8859-1编码读取,因此不能在其中直接写汉字。
1. 使用JDK 的native2ascii工具转换汉字为\uXXXX格式。命令行:native2ascii –encoding GBK inputfile outputfile
2. 对读入的字符串进行转换:byte[] b = str.getBytest(“ISO-8859-1”); str = new String(b,”GBK”);

3.4 读取XML文件
XML文件读写同于文件读写,但应注意确保XML头中声明如<? xml version=”1.0” encoding=”gb2312”?>与文件编码保持一致。

3.5 WEB/Servlet/JSP
1. 对于JSP,确定头部加上 <%@ page contentType="text/html;charset=gbk"%>这样的标签。
2. 对于Servlet,确定 设置setContentType (“text/html; charset=gbk”),以上两条用于使得输出汉字没有问题。
3. 为输出HTML head中加一个 <meta http-equiv="Content-Type" content="text/html; charset=gbk"> ,让浏览器正确确定HTML编码。
4. 为Web应用加一个Filter,确保每个Request明确调用setCharacterEncoding方法,让输入汉字能够正确解析。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值