推荐
http://gceclub.sun.com.cn/developer/technicalArticles/Intl/Supplementary/index_zh_CN.html
http://www.linuxpk.com/3821.html
=======================================
BMP的解释:
http://zh.wikipedia.org/w/index.php?title=%E5%9F%BA%E6%9C%AC%E5%A4%9A%E6%96%87%E7%A8%AE%E5%B9%B3%E9%9D%A2&variant=zh-cn
http://zh.wikipedia.org/w/index.php?title=%E8%BE%85%E5%8A%A9%E5%B9%B3%E9%9D%A2&variant=zh-cn#.E7.AC.AC.E4.B8.80.E8.BC.94.E5.8A.A9.E5.B9.B3.E9.9D.A2
1个BMP和16个辅助plane,需要21个bits.

======================================
ISO-10646与Unicode关系
http://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E5%AD%97%E7%AC%A6%E9%9B%86
ISO-10646术语
Unicode术语
UCS-2   BMP UTF-16
UCS-4     UTF-32
注意:UTF-16可看成是UCS-2的父集。在沒有辅助平面字符前,UTF-16與UCS-2所指的是同一的意思。但當引入辅助平面字符後,就只稱為UTF-16了,因为我们会使用2个UTF-16,也就似乎4bytes保存一个辅助平面字符。現在若有軟件聲稱自己支援UCS-2編碼,那其實是暗指它不能支援辅助平面字符的委婉語。
======================================
UTF-8要完整表达unicode需要4bytes,表达BMP需要3bytes,见http://en.wikipedia.org/wiki/UTF-8,注意“The range D800-DFFF is disallowed by Unicode. The encoding scheme reliably transforms values in that range, but they are not valid scalar values in Unicode. See Table 3-7 in the Unicode 5.0 standard. ”


======================================
BOM Byte Order Mark,在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。
这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。
字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符"ZERO WIDTH NO-BREAK SPACE"(也就是U+FEFF)的UTF-8编码是EF BB BF(就是11101111,10111011,10111111)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
Windows就是使用BOM来标记文本文件的编码方式的。

除了FEFF,英文wiki http://en.wikipedia.org/wiki/UTF-8还解释说明了一些目前不会出现在utf-8字节流中的byte值。

=========================================
Java
http://www.jorendorff.com/articles/unicode/java.html
http://gceclub.sun.com.cn/developer/technicalArticles/Intl/Supplementary/index_zh_CN.html 完美解释java中的unicode。另外提到java中utf-8其实有两种格式,分别是标准utf-8和改良utf-8。对于文本输入,Java 2 SDK 提供用于接受“\Uxxxxxx”格式字符串的代码点输入方法,这里大写的“U”表示转义序列包含六个十六进制数字,因此允许使用增补字符。小写的“u”表示转义序列“\uxxxx”的原始格式。
http://dlog.cn/html/diary/showlog.vm?sid=2&cat_id=-1&log_id=557 介绍了String的JDK5新增方法
http://blog.csdn.net/qinysong/archive/2006/09/05/1179480.aspx 连着三篇用实例说明,语言比较乱,说的也不尽正确,但他用了做试验的java代码有点意思,能帮助思考代码中一些tricky的现象。
http://topic.csdn.net/u/20070928/22/5207088c-c47d-43ed-8416-26f850631cff.html 有一些回答,
http://topic.csdn.net/u/20070515/14/57af3319-28de-4851-b4cf-db65b2ead01c.html 有些试验代码,价值不大
http://www.w3china.org/blog/more.asp?name=hongrui&id=24817 有些java实例代码,没细看。


另:
Java 1.0 supports Unicode version 1.1.
Java 1.1 onwards supports Unicode version 2.0.
J2SE 1.4中的字符处理是基于Unicode 3.0标准的。
J2SE v 1.5 supports Unicode 4.0 character set.

而:
Unicode 3.0:1999年九月;涵蓋了來自ISO 10646-1的十六位元通用字元集(UCS)基本多文種平面(Basic Multilingual Plane)

Unicode 3.1:2001年三月;新增從ISO 10646-2定義的輔助平面(Supplementary Planes)


所以:
代码点在U+0000到U+FFFF之间的就用\u0000到\uffff表示
U+10000到U+1FFFF之间的用   \ud800到\udbff中的作为第一个单元,   用\udc00到\udfff作为第二单元,组合起来表示
char这个概念就是指\u0000到\uffff,这是占两个字节
其余的用code   point这个概念
JDK   1.5   以上支持   Unicode   4.0,也就是   Unicode   的范围是   U+0000~U+10FFFF,
超过   U+FFFF   的字符采用代码点(也就是   int   类型的数据)来表示,具体的可以
参考一下下面这个链接的文章《Java   平台中的增补字符》,对此作了很详细的介
绍。 http://gceclub.sun.com.cn/developer/technicalArticles/Intl/Supplementary/index_zh_CN.html


================================
http://www.blogjava.net/tim-wu/archive/2007/09/12/144550.html

================================

U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
但目前ISO和Unicode组织都不会规定10FFFF以上的字符
代碼範圍
十六進制
標量值(scalar value
二進制
UTF-8
二進制 / 十六進制
註釋
000000 - 00007F
128個代碼
00000000 00000000 0zzzzzzz 0zzzzzzz(00-7F) ASCII等值範圍,位元組由零開始
七個z 七個z
000080 - 0007FF
1920個代碼
00000000 00000yyy yyzzzzzz 110yyyyy(C2-DF) 10zzzzzz(80-BF) 第一個位元組由110開始,接著的位元組由10開始
三個y;二個y;六個z 五個y;六個z
000800 - 00FFFF
63488個代碼
00000000 xxxxyyyy yyzzzzzz 1110xxxx(E0-EF) 10yyyyyy 10zzzzzz 第一個位元組由1110開始,接著的位元組由10開始
四個x;四個y;二個y;六個z 四個x;六個y;六個z
010000 - 10FFFF
1048576個代碼
000wwwxx xxxxyyyy yyzzzzzz 11110www(F0-F4) 10xxxxxx 10yyyyyy 10zzzzzz 由11110開始,接著的位元組由10開始
三個w;二個x;四個x;四個y;二個y;六個z 三個w;六個x;六個y;六個z

================================
参考:http://blog.csdn.net/qinysong/archive/2006/09/05/1179480.aspx,但该文对unicode版本说明有误,说明见上

在大约 1993 年之后开发的大多数现代编程语言都有一个特别的数据类型, 叫做 Unicode/ISO 10646-1 字符. 在 Ada95 中叫 Wide_Character, 在 Java 中叫 char.

ISO C 也详细说明了处理多字节编码和宽字符 (wide characters) 的机制, 1994 年 9 月 Amendment 1 to ISO C 发表时又加入了更多. 这些机制主要是为各类东亚编码而设计的, 它们比处理 UCS 所需的要健壮得多. UTF-8 是 ISO C 标准调用多字节字符串的编码的一个例子, wchar_t 类型可以用来存放 Unicode 字符.