Hướng dẫn ansi to utf-8 python - ansi sang utf-8 python

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.

Chủ Đề