a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 96|回复: 0

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

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
Java认证之Java中编码以及Unicode总结(8): A# v! {; R! b, g
11
. r9 ?' J' @, z+ }. G* C% E: f. b: J  字节序5 @. q7 D1 T7 h+ T
  根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。例如:
' C$ n/ u  X7 j( r3 g  Unicode编码 ║ UTF-16LE ║ UTF-16BE ║ UTF32-LE ║ UTF32-BE- `: H) S4 v9 F# ~$ h
  0×006C49 ║ 49 6C ║ 6C 49 ║ 49 6C 00 00 ║ 00 00 6C 49
0 ~8 ?# w+ Y& q* t* e! k  0×020C30 ║ 43 D8 30 DC ║ D8 43 DC 30 ║ 30 0C 02 00 ║ 00 02 0C 30- q  f& B6 c. k6 u% \
  BOM! ]& J) U" T$ q' R* B6 N* X
  那么,怎么判断字节流的字节序呢?Unicode标准建议用BOM(Byte Order Mark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符”零宽无中断空格”。这个字符的编码是FEFF,而反过来的FFFE(UTF- 16)和FFFE0000(UTF-32)在Unicode中都是未定义的码位,不应该出现在实际传输中。下表是各种UTF编码的BOM:" k5 I* B4 X. {$ o
  UTF编码 ║ Byte Order Mark7 `3 J8 F% G. i
  UTF-8 ║ EF BB BF2 ~7 Y; m0 _& h4 F; E
  UTF-16LE ║ FF FE& e% `. L2 K5 Z' Y3 Y
  UTF-16BE ║ FE FF- [, D+ ?8 A% b7 ?2 d5 z2 ?- G
  UTF-32LE ║ FF FE 00 00! B. H5 F- s* o: v7 E' D
  UTF-32BE ║ 00 00 FE FF
( s3 Z0 x7 t  ]4 Z. [) @  5、
9 c: Y. i. D5 c4 O0 T  java中使用的Unicode
" ]- C8 D# R  k- O8 P: n% @- X  5.1 内部编码( o0 c: h" V, T3 }) b$ w
  Java中,字符只以一种形式存在,那就是JVM内部的内部表示,Unicode码编号(U+0000~U+10FFFF)。JVM的唯一确定一个字符使得一个编码在进入jvm或者从jvm输出时需要进行编码转换。也就是编码转换只发生在JVM和OS以及网络传输的交互地带,也就是IO的各种 byte或者 reader/writer输入输出发生作用的地方。在JVM和OS以及网络流交互的时间,Reader和Writer只是适用默认编码进行了默认的编码转换,来转换为字符流。面向字符是指系统文件中的字符和内存中的要一致。而面向字节是要保证系统中的二进制内容和读入JVM内部的二进制内容要一致。
# w8 Z* Q/ Q5 x& }9 Y' {! Q  5.2 utf-16
7 @, H9 {- o% H  ?5 C" @( A  总共17个平面- l" K, f% M3 ]- ~
  0×0000~0×10FFFF 1114112-2048=1112064个码位& |) }( A  C: }5 x
  Unicode已定义的码位是238605个
* ~) |& _8 D1 B! C  平面15之定义了占65534个码位的专用区,0xF0000~0xFFFFD。- Y) m7 T3 _4 p& ?" A1 k1 [4 [
  平面16之定义了占65534个码位的专用区,0×100000~0×10FFFD。% x/ ?- g" W7 C3 [
  平面0中定义了6400个专有区,0xE0000~0xF8FF。
0 C* h3 o; G6 U9 x+ Y4 z  238605-65534*2-6400-2408=99089余下的分布在平面0、1、2、14上。
! E! N! B% z" X; D6 ^+ v% {, U/ X* U  12
2 X- c& ^: q0 \- `% X9 Z2 K  平面0上定义了52080个字符;! u: C$ R. i- h! v
  平面1上定义了3419个字符;
+ Q1 @( @5 L* I  平面2上定义了43253个字符;5 l/ K1 p: n" j% x5 z
  平面14上定义了337个字符。* P0 V6 q. Y& l/ i
  平面2的43253个字符都是汉字,平面0上定义了27973个汉字。) ]; k/ o- Q# b. F6 ]" M
  基本平面 0×0000~0xFFFF$ r+ z# O  a$ G4 R0 a. W, C
  1~14平面 0×10000~0xEFFFF 0xD800~0xDBFF高位 DCOO~DFFF低位& w4 U3 K# V: V4 K  F3 h" R2 N
  15平面 0xF0000~0xFFFFF 0xDB80~0xDBBF高位 DCOO~DFFF低位( h% n5 O! q5 ]3 L8 a5 \
  16平面 0×100000~0×10FFFF 0xDBC0~0xDBFF高位 DCOO~DFFF低位0 t. L. s% F: J
  5.3高位序列和低位序列的判断
) Y0 W) G+ d) X. M  java.lang.String#getBytes(String) 的源代码4 P" J1 e/ Z8 e+ d3 o! C
  java.lang.StringCoding.encode 的源代码,再通过其底层类库的字符集类sun.io.CharacterEncoding 可以找出 Unicode 的转换器,是采用sun.io.CharToByteUnicode 这个类的,这个类的 sun.io 包是读取file.encoding.pkg 这个系统属性拼接字符串反射而来的。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 06:35 , Processed in 0.187949 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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