Java认证之Java中编码以及Unicode总结(9)
0 _ N3 I, w) }1 ^ 6、
% h' B1 g2 v8 c 常见问题) p# @0 {5 `8 ^' X$ ~4 k* [- T
6.1 通用UTF-8来编码
+ P/ R7 N# Q7 S& ? 大量使用国外的开源软件时,UTF-8才是编码界最通用的语言。对英文是单字节、中文是三字节。在大量的英文存在的情况下高效。
; F# J2 @) }; J% b E/ l 6.2编码问题时查看3 ]# p) M2 H1 \( A$ c7 t5 J- f
%javahome%/jre/lib/charsets.jar
. G) h6 J' A! h1 A( ^ 6.3 语言的编码: i5 \( `/ r4 E8 _5 k/ l
C、C++、Python2内部字符串都是使用当前系统默认编码。, N% u$ f9 I9 P3 h5 k, z1 T4 V* S/ v' ?( [
Python3、Java内部字符串用Unicode保存。$ @4 e' r( q/ L4 h
Ruby有一个内部变量$KCODE用来表示可识别的多字节字符串的编码,变量值为”EUC” “SJIS” “UTF8″ “NONE”之一。$KCODE的值为”EUC”时,将假定字符串或正则表达式的编码为EUC-JP。同样地,若为”SJIS”时则认定为Shift JIS。若为”UTF8″时则认定为UTF-8。若为”NONE”时,将不会识别多字节字符串。在向该变量赋值时,只有第1个字节起作用,且不区分大小写字母。”e” “E” 代表”EUC”,”s” “S” 代表 “SJIS”,”u” “U” 代表 “UTF8″,而”n” “N” 则代表 “NONE”。默认值为”NONE”。即默认情况下Ruby把字符串当成单字节序列来处理。
: f- a: g7 M* n# S+ P3 \1 S# D/ w 6.4 js的unicode8 N+ D: t5 \6 e |* j
13
% L" I2 }- r" c I" y9 r: u2 s) i' H& p 6.5 网页编码
9 X) j& I* a& O5 S 一个网页要在浏览器中正常显示,需要保持网页文件的编码、网页的meta标签声明(charset 来制定的其实是encoding编码而不是字符集)、浏览器编码设置是一致的。
# p: X) x7 Q$ ^2 c; [) A9 x 6.6 联通乱码
: X4 E8 F2 m/ S: J, G' _5 h 在Win下的新建一个记事本文件,输入”联通”两个字之后,保存之后重新打开,发现出现乱码。这是因为GBK编码与UTF8编码产生了编码冲突。& E( a$ Z3 h. O. B4 Y o% s
从UNICODE到UTF8的转换规则:
. b+ b$ Q, x+ K- Y0 z5 H* J; r Unicode UTF-8
- r. e# o2 t o0 s4 c 0000 – 007F 0xxxxxxx1 f. d2 O3 ~7 K! ?" {( x; j$ p7 m
0080 – 07FF 110xxxxx 10xxxxxx% d/ J7 C `& O- ^# J9 Y6 C
0800 – FFFF 1110xxxx 10xxxxxx 10xxxxxx
" v2 w ]) a7 U8 b9 \! E- p/ c联的Unicode编码是[0x80] [0x54]5 h7 D P4 F3 r3 ?5 J, ]
通的Unicode编码是[0x90] [0x1A]* d- v4 m# j" S) x) ]" p
8054和901A在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。使用第三种转换得到
9 N" u5 Q+ N! h+ X$ z7 |0 ?3 m [0xE8] [0x81] [0x94] [0xE9] [0x80] [0x9A],这就是其UTF8的编码。* T" @: v* C+ d( d
新建一个文本文件时,记事本的编码默认是ANSI, 中文的就是GBK编码,而,此时”联通”的内码是:[0xC1] [0xAA] [0xCD] [0xA8]& J# t, g, Z1 X/ r7 H/ U
C1 1100 0001
0 C9 p q5 x, N# X0 u AA 1010 1010+ R4 `; Z# c6 V8 e* l; B4 }
CD 1100 1101& m& t: b$ I7 T- ]7 }
A8 1010 1000
7 x) h. t* G9 W 其中联的两个字节、通的两个字节的起始部分的都是”110″和”10″,与UTF8规则里的两字节模板是一致,所以再次用记事本打开时,记事本误认为这是一个UTF8编码的文件。按照反编码得到UNICODE的0x 006A,和0×0368,0×0368这个字符什么也不是,这就是”联通”两个字的文件没有办法在记事本里正常显示的原因。如果多几个字的输入话,由于记事本检测到不是合格的uft-8编码的字节转而会采用GBK,乱码又不出现。 |