Hướng dẫn python open file encoding ansi - python mở mã hóa tệp ansi

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 India  

Nế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.

Mã hóa = 'latin1 trong python là gì?

Latin Latin-1 là một mã hóa tương thích ASCII quan trọng khác, vì nó ánh xạ các giá trị byte trực tiếp đến 256 điểm mã Unicode đầu tiên.maps byte values directly to the first 256 Unicode code points.

Python có mặc định cho UTF không

Mã hóa mặc định của các tệp nguồn Python là UTF-8.JSON, TOML, YAML Sử dụng UTF-8.Hầu hết các trình chỉnh sửa văn bản, bao gồm mã Visual Studio và Windows Notepad sử dụng UTF-8 theo mặc định.. JSON, TOML, YAML use UTF-8. Most text editors, including Visual Studio Code and Windows Notepad use UTF-8 by default.

Mã hóa ANSI là gì?

ANSI và UTF-8 đều là định dạng mã hóa.ANSI là định dạng byte phổ biến được sử dụng để mã hóa bảng chữ cái Latin;Trong khi đó, UTF-8 là định dạng Unicode có độ dài thay đổi (từ 1 đến 4 byte) có thể mã hóa tất cả các ký tự có thể.the common one byte format used to encode Latin alphabet; whereas, UTF-8 is a Unicode format of variable length (from 1 to 4 bytes) which can encode all possible characters.

Mã hóa CP1252 trong Python là gì?

Windows-1252 hoặc CP-1252 (mã trang 1252) là mã hóa ký tự một byte của bảng chữ cái Latin, được sử dụng theo mặc định trong các thành phần di sản của Microsoft Windows cho tiếng Anh và nhiều ngôn ngữ châu Âu bao gồm tiếng Tây Ban Nha, tiếng Pháp và tiếng Đức.a single-byte character encoding of the Latin alphabet, used by default in the legacy components of Microsoft Windows for English and many European languages including Spanish, French, and German.