MS Notepad cung cấp cho người dùng lựa chọn 4 mã hóa, được thể hiện bằng thuật ngữ khó hiểu vụng về:
"Unicode" là UTF-16, viết Little-endian. "Unicode Big Endian" là UTF-16, được viết Big-Endian. Trong cả hai trường hợp UTF-16, điều này có nghĩa là BOM thích hợp sẽ được viết. Sử dụng utf-16 để giải mã một tệp như vậy.
"UTF-8" là UTF-8; Notepad viết rõ ràng một "BOM UTF-8". Sử dụng utf-8-sig để giải mã một tệp như vậy.
"ANSI" là một cú sốc. Đây là thuật ngữ MS cho "bất kể mã hóa di sản mặc định là trên máy tính này".
Dưới đây là danh sách các mã hóa Windows mà tôi biết và các ngôn ngữ/tập lệnh mà chúng được sử dụng cho:
cp874 Thai cp932 Japanese cp936 Unified Chinese (P.R. China, Singapore) cp949 Korean cp950 Traditional Chinese (Taiwan, Hong Kong, Macao(?)) cp1250 Central and Eastern Europe cp1251 Cyrillic ( Belarusian, Bulgarian, Macedonian, Russian, Serbian, Ukrainian) cp1252 Western European languages cp1253 Greek cp1254 Turkish cp1255 Hebrew cp1256 Arabic script cp1257 Baltic languages cp1258 Vietnamese cp???? languages/scripts of IndiaNếu tệp đã được tạo trên máy tính nơi nó đang được đọc, thì bạn có thể có được mã hóa "ANSI" bằng locale.getpreferredencoding(). Mặt khác, nếu bạn biết nó đến từ đâu, bạn có thể chỉ định mã hóa để sử dụng nếu nó không phải là UTF-16. Thất bại điều đó, đoán.
Hãy cẩn thận bằng cách sử dụng codecs.open() để đọc các tệp trên Windows. Các tài liệu nói: "" "Các tệp ghi chú luôn được mở ở chế độ nhị phân, ngay cả khi không có chế độ nhị phân nào được chỉ định. Điều này được thực hiện để tránh mất dữ liệu do mã hóa sử dụng các giá trị 8 bit. Điều này có nghĩa là không tự động chuyển đổi '\ n 'Được thực hiện khi đọc và viết. "" "Điều này có nghĩa là các dòng của bạn sẽ kết thúc vào \r\n và bạn sẽ cần/muốn loại bỏ chúng.
Để tất cả chúng cùng nhau:
Tệp văn bản mẫu, được lưu với cả 4 lựa chọn mã hóa, có vẻ như thế này trong Notepad:
The quick brown fox jumped over the lazy dogs. àáâãäåĐây là một số mã demo:
import locale def guess_notepad_encoding(filepath, default_ansi_encoding=None): with open(filepath, 'rb') as f: data = f.read(3) if data[:2] in ('\xff\xfe', '\xfe\xff'): return 'utf-16' if data == u''.encode('utf-8-sig'): return 'utf-8-sig' # presumably "ANSI" return default_ansi_encoding or locale.getpreferredencoding() if __name__ == "__main__": import sys, glob, codecs defenc = sys.argv[1] for fpath in glob.glob(sys.argv[2]): print print (fpath, defenc) with open(fpath, 'rb') as f: print "raw:", repr(f.read()) enc = guess_notepad_encoding(fpath, defenc) print "guessed encoding:", enc with codecs.open(fpath, 'r', enc) as f: for lino, line in enumerate(f, 1): print lino, repr(line) print lino, repr(line.rstrip('\r\n'))Và đây là đầu ra khi chạy trong cửa sổ "Lời nhắc lệnh" Windows bằng lệnh The quick brown fox jumped over the lazy dogs. àáâãäå 0
('t1-ansi.txt', '') raw: 'The quick brown fox jumped over the lazy dogs.\r\n\xe0\xe1\xe2\xe3\xe4\xe5 \r\n' guessed encoding: cp1252 1 u'The quick brown fox jumped over the lazy dogs.\r\n' 1 u'The quick brown fox jumped over the lazy dogs.' 2 u'\xe0\xe1\xe2\xe3\xe4\xe5\r\n' 2 u'\xe0\xe1\xe2\xe3\xe4\xe5' ('t1-u8.txt', '') raw: '\xef\xbb\xbfThe quick brown fox jumped over the lazy dogs.\r\n\xc3\xa0\xc3 \xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5\r\n' guessed encoding: utf-8-sig 1 u'The quick brown fox jumped over the lazy dogs.\r\n' 1 u'The quick brown fox jumped over the lazy dogs.' 2 u'\xe0\xe1\xe2\xe3\xe4\xe5\r\n' 2 u'\xe0\xe1\xe2\xe3\xe4\xe5' ('t1-uc.txt', '') raw: '\xff\xfeT\x00h\x00e\x00 \x00q\x00u\x00i\x00c\x00k\x00 \x00b\x00r\x00o\x00w \x00n\x00 \x00f\x00o\x00x\x00 \x00j\x00u\x00m\x00p\x00e\x00d\x00 \x00o\x00v\x00e \x00r\x00 \x00t\x00h\x00e\x00 \x00l\x00a\x00z\x00y\x00 \x00d\x00o\x00g\x00s\x00. \x00\r\x00\n\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\r\x00\n\x00' guessed encoding: utf-16 1 u'The quick brown fox jumped over the lazy dogs.\r\n' 1 u'The quick brown fox jumped over the lazy dogs.' 2 u'\xe0\xe1\xe2\xe3\xe4\xe5\r\n' 2 u'\xe0\xe1\xe2\xe3\xe4\xe5' ('t1-ucb.txt', '') raw: '\xfe\xff\x00T\x00h\x00e\x00 \x00q\x00u\x00i\x00c\x00k\x00 \x00b\x00r\x00o\ x00w\x00n\x00 \x00f\x00o\x00x\x00 \x00j\x00u\x00m\x00p\x00e\x00d\x00 \x00o\x00v\ x00e\x00r\x00 \x00t\x00h\x00e\x00 \x00l\x00a\x00z\x00y\x00 \x00d\x00o\x00g\x00s\ x00.\x00\r\x00\n\x00\xe0\x00\xe1\x00\xe2\x00\xe3\x00\xe4\x00\xe5\x00\r\x00\n' guessed encoding: utf-16 1 u'The quick brown fox jumped over the lazy dogs.\r\n' 1 u'The quick brown fox jumped over the lazy dogs.' 2 u'\xe0\xe1\xe2\xe3\xe4\xe5\r\n' 2 u'\xe0\xe1\xe2\xe3\xe4\xe5'Những điều cần nhận biết:
. Trên một hệ thống trong đó mã hóa mặc định là The quick brown fox jumped over the lazy dogs. àáâãäå 1, nó tạo ra như The quick brown fox jumped over the lazy dogs. àáâãäå 2 (aarrgghh !!); xem bên dưới
>>> all_bytes = "".join(map(chr, range(256))) >>> u1 = all_bytes.decode('cp1252', 'replace') >>> u2 = all_bytes.decode('mbcs', 'replace') >>> u1 == u2 False >>> [(i, u1[i], u2[i]) for i in xrange(256) if u1[i] != u2[i]] [(129, u'\ufffd', u'\x81'), (141, u'\ufffd', u'\x8d'), (143, u'\ufffd', u'\x8f') , (144, u'\ufffd', u'\x90'), (157, u'\ufffd', u'\x9d')] >>>. Và hoàn toàn không phải là tiếng Ả Rập.