输出当前系统支持的所有字符集

Java:输出当前系统支持的所有字符集
public class ShowAvailableCharset{
public static void main(String[] strs){
java.util.SortedMap map = java.nio.charset.Charset.availableCharsets();
java.util.Set keys = map.keySet();
java.util.Iterator it = keys.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}



java中文问题详解(final and original)2009-03-16 9:04java虚拟机默认的编码是unicode指的是内存中的编码是unicode,而进行io(包括网络和硬盘)传输时另外编码,通过 System.getProperty("file.encoding")查看,通常,默认为ansi,不过通过eclipse可以配置为其他编码,记为charSet;当以reader或者writer方式读写时,会自动按照配置的方式转换成unicode,而当以stream的方式读写时,不会转换,因此,如果硬盘上的字符如果不是以charSet存储,则出现乱码。
内存中编码转换方法:
string.getByte("gbk");把内存中的unicode字符转换成gbk字节
new String(byte[],"utf-8");报byte中的字节按照utf-8进行解码,转换成unicode

与文件交互转换方法:
BufferedReader br=new BufferedReader(ner InputStreamReader(new FileInputStream(path),charSet));
charSet值的就是文件保存的字符集,最好通过System.getProperty(file.encoding获得);
writer类似;

对于发送数据,服务器按照response.setCharacterEncoding—contentType—pageEncoding的优先顺序,对要发送的数据进行编码。

不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。

汉字区位码和unicode是规定怎么表示文字的,汉字内码和UTF是规定怎么(在硬盘)存储和传送文字的,后者是前者的实际实现方式,ucnicode也可以存储字符,但比较占空间。
url编码就是一个字符ascii码的十六进制。不过在每个字节前面加上了"%";其中多字节字符由于最高位是1,因此它要先被转成UTF-8

当一个软件打开一个文本时,它要做的第一件事是决定这个文本究竟是使用哪种字符集的哪种编码保存的。
开头字节 Charset/encoding(即BOM),如下表:
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.

big endian更接近人类思考,但x86采用的是little endian,即在寄存器中是得字节在前,便于cpu读写
*****************************************************************************************************
unicode:
有两套标准:
UCS-2(Unicode-16)用2个

字节为字符编码
UCS-4(Unicode-32)用4个字节为字符编码。
但是0xFFFF以上的字符尚未定义,因此目前说unicode主要指ucs-2(bmp)

UTF意为Unicode文本格式。对于UTF,是这样定义的:
(1)0x0000到0x007F (前9位0,ascii)则用1个字节表示,这个字节的首位是“0”,剩下的7位与原字符中的后7位相同
(2)0x0080到x07FF (前5位0 )则用2个字节表示,首字节“110”开头,后5位与原编码除去5个零后的高5位同;次字节以“10”开头,后6位与原编码的低6位相同
(3)0x0800到0xFFFF 则用三个字节表示。首节以 “1110”开头,后4位为原编码的高4位;第二个字节以“10”开头,后6位为原编码中间的6位;第三个字节以“10”开头,后6位为原编码的低6位;
简化如下:ASCII字母继续使用1字节储存,重音文字、希腊字母或西里尔字母等使用2字节来储存,而常用的汉字就要使用3字节。辅助平面字符则使用4字节。

或:
1. 对英文,仍然和ASCII一样用1个字节表示,这个字节的值小于128(\x80);
2. 对其他语言的用一个值位于128-256之间的字节开始,再加后面紧跟的2个字节表示,一个字符一共是3个字节;
**************************************************************************************
ISO-8859-n系列都是单字节字符,不同的n表示扩展不同类型的字母,比如其他西欧字母,希腊字母等
ISO-8859-1:理解为ascii的扩展,容纳256种字符,以字节为单位,解释时,每个字节直接加上8位0就变成相应的Unicode字符。解释gbk中文时,要拆分成两个字节,就变成两个Unicode,出现乱码。
GB2312:区位码+0xA0得到。“高位字节”使用了0xA1-0xF7(把0x01-0x57区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把0x01-0x5E加上0xA0)。
GB2312 支持的汉字太少。1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。汉字区包括21003个字符。2000年的 GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字

狭义的ascii指1-127之间的字符,广义的ascii指的是iso-8859-1

****************************************************************************
在java中,内存中字符串以unicode保存,因此对于读取文件得到的java字符乱码,可先通过byte[] b=str.getByte("iso-8859-1");还原成"iso-8851",即ascii,然后通过new String(b,"gbk");即可得到完整的unicode字符串。

当页面中的表单提交字符串时,首先把字符串按照当前页面的编码,转化成字节串。然后再将每个字节转化成 "%XX" 的格式提交到 Web 服务器。比如,一个编码为 GB2312 的页面,提交 "中" 这个字符串时,提交给服务器的内容为 "%D6%D0"。
在服务器端,Web 服务器把收到的 "%D6%D0" 转化成 [0xD6, 0xD0] 两个字节,即当提交 "

%D6%D0" 给 Tomcat 服务器时,request.getParameter() 将返回 [0x00D6, 0x00D0] 两个 UNICODE 字符,而不是返回一个 "中" 字符。因此,我们需要使用 bytes = string.getBytes("iso-8859-1") 得到原始的字节串,再用 string = new String(bytes, "GB2312") 重新得到正确的字符串 "中"。

<%@ page pageEncoding="GB2312%>指的是本页面将要在硬盘中存储的格式,如果为iso-8859-1而且文中有中文,由于eclipse内存中是unicode编码,所以暂时显示,但是保存时要保存成iso-8859-1,则会提示格式错误.
<%@ page contentType="txt/heml/charset=gb2312"%>指的是当本文档显示到用户浏览器上时,以那种编码显示。如果用户看到乱码,说明用户浏览器的设定解码方式和这个值不符。 在xx_jsp.java中,这句话被翻译成response.setContentType("text/html;charset=gb2312");
<%@request.setCharacterEncoding("text/html;charset=gb2312")%>;注意是request,他的作用是通知服务器本页面传递的参数要用gb2312解码。
在servlet中:
request.setCharacterEncoding("gb2312");表示要用此方式解析用户传过来的变量,注意,要和<%@request.setCharacterEncoding("text/html;charset=gb2312")%>对应。
response.setContentType("text/html;charset=gb2312");表示想浏览器回应时的编码方式,和<%@ page contentType="txt/heml/charset=gb2312"%>的作用相同。


相关文档
最新文档