@import url(http://www.shnenglu.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
最低位地址存放高位字節(jié),可稱高位優(yōu)先,內(nèi)存從最低地址開始按順序存放(高數(shù)位數(shù)字先寫)。最高位字節(jié)放最前面。
例如“漢”字的Unicode編碼是6C49。如果將6C寫在前面,就是big endian。還是將49寫在前面,就是little endian
Endian可讀為字節(jié)序.
0x11BB,高字節(jié)為11,低字節(jié)為BB
Big Endian: 高字節(jié)存儲(chǔ)在高位,低字節(jié)存儲(chǔ)在低位: 高字節(jié)結(jié)束存儲(chǔ): BB 11
Little Endian: 高字節(jié)存儲(chǔ)在低位,低字節(jié)存儲(chǔ)在高位: 低字節(jié)結(jié)束存儲(chǔ): 11 BB
數(shù)字的高低位與存儲(chǔ)中位置偏移的高低位正好相反. Little Endian更適合閱讀,因?yàn)?1BB存儲(chǔ)為11BB.
import java.nio.ByteOrder;
public class Test {
public static void main(String[] args) {
char c = '\u11BB';
String endian = Integer.toHexString(c & 0xFF).toUpperCase();
System.out.println(endian.equals("BB") ? "Little Endian" : "Big Endian");
System.out.println(ByteOrder.nativeOrder());
}
}
BOM(字節(jié)序標(biāo)志): Byte Order Mark
UTF-16是以兩個(gè)字節(jié)為編碼單元,要考慮字節(jié)序,所以使用BOM來標(biāo)志字節(jié)序: FEFF or FFFE.
FEFF 又叫做 Zero Witdh No-Break Space,它在UCS中是不存在的字符,所以用來標(biāo)志字節(jié)序,又稱做BOM.
FEFF: Big Endian
FFEF: Little Endian
A: The following table summarizes some of the properties of each of the UTFs.
Name | UTF-8 | UTF-16 | UTF-16BE | UTF-16LE | UTF-32 | UTF-32BE | UTF-32LE |
Smallest code point |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
0000 |
Largest code point |
10FFFF |
10FFFF |
10FFFF |
10FFFF |
10FFFF |
10FFFF |
10FFFF |
Code unit size |
8 bits |
16 bits |
16 bits |
16 bits |
32 bits |
32 bits |
32 bits |
Byte order |
N/A |
<BOM> |
big-endian |
little-endian |
<BOM> |
big-endian |
little-endian |
Fewest bytes per character |
1 |
2 |
2 |
2 |
4 |
4 |
4 |
Most bytes per character |
4 |
4 |
4 |
4 |
4 |
4 |
4 |
Windows保存的Unicode文件是含有BOM的,UTF-8編碼的文件以字節(jié)為編碼單元,不存在字節(jié)序的問題,但可以使用BOM來表示編碼方式: 文件前3字節(jié)是EF BB BF,為UTF-8編碼。因?yàn)镕EFF在UTF-8里的編碼為EF BB BF.
Mac下的TextEdit保存為UTF-8就不含BOM
TextWrangler可以選擇是否包含有BOM
一個(gè)漢字在Unicode中用兩個(gè)字節(jié)表示,a-z等字母也是兩個(gè)字節(jié)。
UTF-8是Unicode的一種表現(xiàn)形式(Unicode編碼值使用UTF-8方式編碼存儲(chǔ)),是一種變長(zhǎng)的表達(dá)方式,把字符的Unicode編碼在文件中表現(xiàn)出來,從一個(gè)字節(jié)到三個(gè)字節(jié)不等(為了減少如a-z等ascii碼字符占用的空間,因?yàn)樗麄兂霈F(xiàn)太頻繁了).
UTF-8編碼范圍為:
0000 - 007F : 0xxxxxxx
0080 - 07FF : 110xxxxx 10xxxxxx
0800 - FFFF : 1110xxxx 10xxxxxx 10xxxxxx
如"漢"的Unicode編碼為6C49,在0800 - FFFF之間,所以要使用3字節(jié)模板: 1110xxxx 10xxxxxx 10xxxxxx
6C49的二進(jìn)制是: 0110 110001 001001
用這個(gè)二進(jìn)制流依次代替3字節(jié)模板中的x得: 1110 0110 10110001 10001001,即E6 B1 89
保存到文件中的就是3個(gè)字節(jié)E6 B1 89,而不是2個(gè)字節(jié)6C 49
// 給InputStreamReader指定要讀取的文件的編碼,讀取時(shí)就不會(huì)出現(xiàn)亂碼了.
public class TextFileReader {
public static void main(String[] args) throws Exception {
String filename = "source/demo-gb18030.txt";
String encoding = "gb18030";
printFile(filename, encoding);
}
// 打印出文件的文本內(nèi)容, 使用指定的編碼讀入文件
public static void printFile(String filename, String encoding) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream(filename), encoding);
BufferedReader reader = new BufferedReader(isr);
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
}
}