@import url(http://m.shnenglu.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
最低位地址存放高位字節,可稱高位優先,內存從最低地址開始按順序存放(高數位數字先寫)。最高位字節放最前面。
例如“漢”字的Unicode編碼是6C49。如果將6C寫在前面,就是big endian。還是將49寫在前面,就是little endian
Endian可讀為字節序.
0x11BB,高字節為11,低字節為BB
Big Endian: 高字節存儲在高位,低字節存儲在低位: 高字節結束存儲: BB 11
Little Endian: 高字節存儲在低位,低字節存儲在高位: 低字節結束存儲: 11 BB
數字的高低位與存儲中位置偏移的高低位正好相反. Little Endian更適合閱讀,因為11BB存儲為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(字節序標志): Byte Order Mark
UTF-16是以兩個字節為編碼單元,要考慮字節序,所以使用BOM來標志字節序: FEFF or FFFE.
FEFF 又叫做 Zero Witdh No-Break Space,它在UCS中是不存在的字符,所以用來標志字節序,又稱做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編碼的文件以字節為編碼單元,不存在字節序的問題,但可以使用BOM來表示編碼方式: 文件前3字節是EF BB BF,為UTF-8編碼。因為FEFF在UTF-8里的編碼為EF BB BF.
Mac下的TextEdit保存為UTF-8就不含BOM
TextWrangler可以選擇是否包含有BOM
一個漢字在Unicode中用兩個字節表示,a-z等字母也是兩個字節。
UTF-8是Unicode的一種表現形式(Unicode編碼值使用UTF-8方式編碼存儲),是一種變長的表達方式,把字符的Unicode編碼在文件中表現出來,從一個字節到三個字節不等(為了減少如a-z等ascii碼字符占用的空間,因為他們出現太頻繁了).
UTF-8編碼范圍為:
0000 - 007F : 0xxxxxxx
0080 - 07FF : 110xxxxx 10xxxxxx
0800 - FFFF : 1110xxxx 10xxxxxx 10xxxxxx
如"漢"的Unicode編碼為6C49,在0800 - FFFF之間,所以要使用3字節模板: 1110xxxx 10xxxxxx 10xxxxxx
6C49的二進制是: 0110 110001 001001
用這個二進制流依次代替3字節模板中的x得: 1110 0110 10110001 10001001,即E6 B1 89
保存到文件中的就是3個字節E6 B1 89,而不是2個字節6C 49
// 給InputStreamReader指定要讀取的文件的編碼,讀取時就不會出現亂碼了.
public class TextFileReader {
public static void main(String[] args) throws Exception {
String filename = "source/demo-gb18030.txt";
String encoding = "gb18030";
printFile(filename, encoding);
}
// 打印出文件的文本內容, 使用指定的編碼讀入文件
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);
}
}
}