a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 137|回复: 0

[专业语言] Java认证之Java中编码以及Unicode总结(9)

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
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,乱码又不出现。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-13 13:05 , Processed in 0.208407 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表