Endian-Ness chỉ áp dụng cho từ đa byte, nhưng UTF-8 sử dụng đơn vị 8 bit để mã hóa thông tin (đó là những gì 8 trong tên viết tắt). Không bao giờ có câu hỏi về sự nhầm lẫn về trật tự ở đó.
Đôi khi có thể cần nhiều hơn một trong các đơn vị đó để mã hóa thông tin, nhưng chúng được coi là khác biệt. Ví dụ, chữ cái A
là một byte, 0x41
. Khi nó phải mã hóa một ký tự có nhiều byte hơn, nó sử dụng một byte chỉ báo hàng đầu, tiếp theo là các byte tiếp tục bổ sung để nắm bắt tất cả thông tin cần thiết cho ký tự đó. Một cách hợp lý, đây là những đơn vị riêng biệt.
GBK sử dụng một sơ đồ tương tự; ký tự sử dụng đơn vị 1 byte và giống như UTF-8, một byte thứ hai có thể được sử dụng cho một số ký tự. Mặt khác,
Mặt khác UCS-2 (và kiểu kế thừa là UTF-16) là định dạng 2 byte. Nó mã hóa thông tin theo đơn vị 16 bit, và 16 bit đó luôn đi cùng nhau. 2 byte trong đơn vị đó thuộc về nhau một cách hợp lý, và các kiến trúc hiện đại coi chúng là một đơn vị, và do đó đã đưa ra quyết định theo thứ tự chúng được lưu trữ. Đó là nơi mà endianess xuất hiện, thứ tự của 2 byte trong một đơn vị phụ thuộc vào kiến trúc. Trong kiến trúc của bạn, các byte được sắp xếp bằng cách sử dụng ít kết thúc, có nghĩa là byte 'nhỏ hơn' đi trước. Đây là lý do tại sao byte 0x4F
xuất hiện trước byte 0x60
trong tệp của bạn.
Lưu ý rằng trăn có thể đọc lớn hoặc nhỏ endian UTF-16 tốt; bạn có thể chọn endianess một cách rõ ràng nếu không có nhân vật chỉ thị vào lúc bắt đầu (các Byte Order Mark, hoặc BOM):
>>> '`O\n\x00'.decode('utf-16')
u'\u4f60\n'
>>> '`O\n\x00'.decode('utf-16-le')
u'\u4f60\n'
>>> 'O`\x00\n'.decode('utf-16-be')
u'\u4f60\n'
Trong ví dụ sau các byte đã được đảo ngược, và giải mã như lớn về cuối nhỏ.
Nguồn
2012-09-08 07:21:30
Vì máy của bạn đặt byte ít quan trọng nhất trước byte quan trọng nhất trong liên kết bộ nhớ, chuỗi ('0x60', '0x4F') đã được đưa vào tệp. Vì vậy, tập tin đọc sẽ mang lại các byte theo thứ tự này. Trong máy của tôi, f1 không phải là '\ xe3 \ xc4 \ n' ?? f2 không phải là f2 '\ xbd \ xe4 \ xa0 \ n' –
@Dd Pp: Vì khi viết một tệp utf-8, gedit đặt byte * một-by-one *. Tuy nhiên, khi viết một tệp mã hóa ucs-2, gedit đặt các byte * hai-by-hai *. Thứ tự trong các byte phụ thuộc vào endianness chỉ trong trường hợp sau. –