面对乱码怎么办---字符集简要介绍

来源:互联网 发布:淘宝店铺掌柜签名范文 编辑:程序博客网 时间:2024/05/21 22:31

  • 字符集
  • 编码
  • 解码

字符集

为了解决二进制序列与字符之间的关系,这就需要字符集.字符集 是为每个字符产生一个编码.也就是一个字符到一个数字的映射关系.所以人人都可以定义一套编码,只要将所有的字符一一对应即可.但是存在的问题是,如果你用自己定义的字符集进行编码,在解码时也要用相同的字符集.否则就会出现乱码.但是早期没有一个统一的标准,而且各国文字相差巨大.因此就涌现除了无数的编码,着实让人头疼.不信你看

SortedMap<String,Charset> map = Charset.availableCharsets();for (String s:map.keySet()){    System.out.println(s+"-->"+map.get(s));}

其输出结果就是Java支持的所有字符集
Big5
Big5-HKSCS
CESU-8
EUC-JP
EUC-KR
GB18030
GB2312
GBK
IBM-Thai
IBM00858
IBM01140
IBM01141
IBM01142
IBM01143
IBM01144
IBM01145
IBM01146
IBM01147
IBM01148
IBM01149
IBM037
IBM1026
IBM1047
IBM273
IBM277
IBM278
IBM280
IBM284
IBM285
IBM290
IBM297
IBM420
IBM424
IBM437
IBM500
IBM775
IBM850
IBM852
IBM855
IBM857
IBM860
IBM861
IBM862
IBM863
IBM864
IBM865
IBM866
IBM868
IBM869
IBM870
IBM871
IBM918
ISO-2022-CN
ISO-2022-JP
ISO-2022-JP-2
ISO-2022-KR
ISO-8859-1
ISO-8859-13
ISO-8859-15
ISO-8859-2
ISO-8859-3
ISO-8859-4
ISO-8859-5
ISO-8859-6
ISO-8859-7
ISO-8859-8
ISO-8859-9
JIS_X0201
JIS_X0212-1990
KOI8-R
KOI8-U
Shift_JIS
TIS-620
US-ASCII
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
UTF-8
windows-1250
windows-1251
windows-1252
windows-1253
windows-1254
windows-1255
windows-1256
windows-1257
windows-1258
windows-31j
x-Big5-HKSCS-2001
x-Big5-Solaris
x-euc-jp-linux
x-EUC-TW
x-eucJP-Open
x-IBM1006
x-IBM1025
x-IBM1046
x-IBM1097
x-IBM1098
x-IBM1112
x-IBM1122
x-IBM1123
x-IBM1124
x-IBM1364
x-IBM1381
x-IBM1383
x-IBM300
x-IBM33722
x-IBM737
x-IBM833
x-IBM834
x-IBM856
x-IBM874
x-IBM875
x-IBM921
x-IBM922
x-IBM930
x-IBM933
x-IBM935
x-IBM937
x-IBM939
x-IBM942
x-IBM942C
x-IBM943
x-IBM943C
x-IBM948
x-IBM949
x-IBM949C
x-IBM950
x-IBM964
x-IBM970
x-ISCII91
x-ISO-2022-CN-CNS
x-ISO-2022-CN-GB
x-iso-8859-11
x-JIS0208
x-JISAutoDetect
x-Johab
x-MacArabic
x-MacCentralEurope
x-MacCroatian
x-MacCyrillic
x-MacDingbat
x-MacGreek
x-MacHebrew
x-MacIceland
x-MacRoman
x-MacRomania
x-MacSymbol
x-MacThai
x-MacTurkish
x-MacUkraine
x-MS932_0213
x-MS950-HKSCS
x-MS950-HKSCS-XP
x-mswin-936
x-PCK
x-SJIS_0213
x-UTF-16LE-BOM
X-UTF-32BE-BOM
X-UTF-32LE-BOM
x-windows-50220
x-windows-50221
x-windows-874
x-windows-949
x-windows-950
x-windows-iso2022jp

不过不用惊慌,我们平时使用最多的也就是以下几种:

  • GBK:简体中文字符集.早期美国人弄出一套字符集只有abc等,所以中国人自己搞出来的一套编码,用来显示中文.
  • UTF-8:8位UCS转换格式,现在以使用utf-8字符集居多
  • BIG5:繁体中文字符集(现在好多人玩个性,输入法打字用繁体,看小说也看繁体,所以也要知道一下该字符集)

平时我们所设置的字符串在文件中都是以某种字符集保存在磁盘中,也就是二进制的数字.同样在网络中所传输的字符串也都是以某种字符集的二进制编码进行传输的.但是我们之所以看到是真实的字符串而不是编码,是因为文本编辑器给我们做了相应的转码.

编码

例如:这里有字符串”中文ABC”,我们可以使用getByte()方法得到其字节码.getByte()方法如果不传入参数,那么就使用的是编译器自带的编码,这里我的编译器默认是”UTF-8”.当然也可以为getByte()指定字符集,这样就会得到相应的字节码.其传入的编码字符串不区分大小写.

String s = "中文ABC";byte[] b0 = s.getBytes();  //使用编译器默认的编码  System.out.print("utf-8编码: ");for (byte b:b0){    System.out.print(Integer.toHexString(b & 0xff) + " ");}System.out.println();byte[] b1 = s.getBytes("UTF-8");  System.out.print("UTF-8编码: ");for (byte b : b1) {    System.out.print(Integer.toHexString(b & 0xff) + " ");}System.out.println();byte[] b2 = s.getBytes("utf-8");  System.out.print("utf-8编码: ");for (byte b : b2) {    System.out.print(Integer.toHexString(b & 0xff) + " ");}System.out.println();byte[] b3 = s.getBytes("GBK");  //"GBK"/"gbk",不区分大小写,这样就以GBK编码,其中文占两个字节,System.out.print("GBK编码:   ");for (byte b : b3) {    System.out.print(Integer.toHexString(b & 0xff) + " ");}System.out.println();//Java本身是双字节编码,即"UTF-16be",中英文均为两个字节byte[] b4 = s.getBytes("UTF-16be");System.out.print("UTF-16be:  ");for (byte b : b4) {    System.out.print(Integer.toHexString(b & 0xff) + " ");}

输出结果为:
utf-8编码: e4 b8 ad e6 96 87 41 42 43
UTF-8编码: e4 b8 ad e6 96 87 41 42 43
utf-8编码: e4 b8 ad e6 96 87 41 42 43
GBK编码: d6 d0 ce c4 41 42 43
UTF-16be: 4e 2d 65 87 0 41 0 42 0 43

由上述结果可以得出:

  • getByte()方法传入的编码字符串不区分大小写.即”UTF-8”与”utf-8”相同.
  • utf-8中,汉字占用三个字节,英文字母占一个字节.
  • gbk中,汉字占用两个字节,英文字母占一个字节.
  • UTF-16be中,汉字和英文字母均占用两个字节.

解码

我们可以根据上述的编码,进行解码,将字符串还原回来.但是注意要用相同的字符集.这里用到的函数是new String(byte[] b,String charsetName).当然也可以不指定charsetName,那么就使用编译器默认的字符集进行解码了

//用上例中UTF-16be进行编码的b4,使用默认的UTF-8进行解码,结果肯定是乱码了String str1 = new String(b4);System.out.println(str1);

输出结果为:
N-e�ABC

这里多说一句,我们平时使用的IDE,如果有项目A与项目B,A采用GBK编码,B采用UTF-8编码.如果将A中的某文件(包含中文)直接拷贝到B中,会出现乱码,如果是复制其中的内容到B的某一个文件内,IDE会自动将其修改为当前项目编码,也就不会出现乱码现象.

1 0
原创粉丝点击