http://www.google.com/search?hl=zh-CN&q=UTF-8+0x7FF&btnG=Google+%E6%90%9C%E7%B4%A2&lr=
java中一個char對應一個int,長度為32bit
而utf-8保存一個char時,長度為1-3個byte,也就是8bit-24bit。
其中code<= 0x7F的,保存為1個byte
(code >= 0x80) && (code <= 0x7FF)的,保存為2個byte
code>0x800的,保存為3個byte
因此lucene中,IndexOutput.writeChars()函數(shù)的代碼為
public void writeChars(String s, int start, int length) throws IOException {
final int end = start + length;
for (int i = start; i < end; i++) {
final int code = (int) s.charAt(i);
if (code >= 0x01 && code <= 0x7F)
writeByte((byte) code);
else if (((code >= 0x80) && (code <= 0x7FF)) || code == 0) {
writeByte((byte) (0xC0 | (code >> 6)));
writeByte((byte) (0x80 | (code & 0x3F)));
} else {
writeByte((byte) (0xE0 | (code >>> 12)));
writeByte((byte) (0x80 | ((code >> 6) & 0x3F)));
writeByte((byte) (0x80 | (code & 0x3F)));
}
}
}
java中一個char對應一個int,長度為32bit
而utf-8保存一個char時,長度為1-3個byte,也就是8bit-24bit。
其中code<= 0x7F的,保存為1個byte
(code >= 0x80) && (code <= 0x7FF)的,保存為2個byte
code>0x800的,保存為3個byte
因此lucene中,IndexOutput.writeChars()函數(shù)的代碼為
















http://www.aygfsteel.com/tim-wu/archive/2007/12/07/165989.html
目前完整的unicode需要4 bytes utf-8才能實現(xiàn)。
參考
http://zh.wikipedia.org/wiki/UTF-8
http://www.aygfsteel.com/tim-wu/archive/2008/01/25/177788.html
另:
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)
BMP中約定了:
D800-DBFF:High-half zone of UTF-16
DC00-DFFF:Low-half zone of UTF-16
因此UTF-8中約定,D800-DFFF無意義。
當然,這兒lucene的實現(xiàn)是可靠的并且可逆的轉換,但它其實使用2個UTF-8來表示本應該用一個4 bytes 來表示的UTF-8符,也就是輔助平面的字符
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/wiki/%E8%BE%85%E5%8A%A9%E5%B9%B3%E9%9D%A2