Python mã hóa Windows

Python không muốn bạn cẩu thả với văn bản của mình. Bộ mã hóa và giải mã của nó (“codec”) tuân theo các tiêu chuẩn có liên quan bất cứ khi nào có thể, điều đó có nghĩa là khi bạn nhận được văn bản không tuân theo các tiêu chuẩn đó, bạn có thể sẽ không giải mã được văn bản đó. Hoặc bạn có thể thành công trong việc giải mã nó vì những lý do triển khai cụ thể, điều này có lẽ còn tệ hơn

Có một số mã hóa mà Python mong muốn không tồn tại, được sử dụng rộng rãi bên ngoài Python

  • “utf-8-variants”, một họ mã hóa không hoàn toàn là UTF-8, bao gồm cả CESU-8 phổ biến chưa từng có và “UTF-8 được sửa đổi Java”

  • Các phiên bản "cẩu thả" của mã hóa bản đồ ký tự, trong đó các byte không ánh xạ tới bất kỳ thứ gì thay vào đó sẽ ánh xạ tới ký tự Unicode có cùng số

Chỉ cần nhập mô-đun này hoặc trên thực tế là bất kỳ phần nào của gói

>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>
0, sẽ cung cấp các “codec xấu” mới này cho Python thông qua API Codec tiêu chuẩn. Bạn không bao giờ phải thực sự gọi bất kỳ chức năng nào bên trong
>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>
1

Tuy nhiên, nếu bạn muốn gọi một cái gì đó vì trình kiểm tra mã của bạn nhất quyết yêu cầu, bạn có thể gọi

>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>
2

Một ví dụ nhanh về giải mã văn bản được mã hóa trong CESU-8

>>> import ftfy.bad_codecs
>>> print(b'\xed\xa0\xbd\xed\xb8\x8d'.decode('utf-8-variants'))
😍

Mã hóa "cẩu thả"

>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>
3 cung cấp mã hóa bản đồ ký tự lấp đầy “lỗ hổng” của chúng theo cách lộn xộn nhưng phổ biến. bằng cách xuất các điểm mã Unicode có cùng số

Điều này cực kỳ xấu xí và nó cũng nằm trong tiêu chuẩn HTML5

Mã hóa byte đơn ánh xạ từng byte thành ký tự Unicode, ngoại trừ một số byte không được ánh xạ. Ví dụ, trong mã hóa Windows-1252 thường được sử dụng, các byte 0x81 và 0x8D, trong số các byte khác, không có ý nghĩa gì

Python, muốn duy trì một số cảm giác đàng hoàng, sẽ xử lý các byte này dưới dạng lỗi. Nhưng Windows biết rằng 0x81 và 0x8D có thể là các byte và chúng khác nhau. Nó chỉ chưa định nghĩa chúng là gì theo thuật ngữ Unicode

Phần mềm phải tương tác với Windows-1252 và Unicode – chẳng hạn như tất cả các trình duyệt Web phổ biến – sẽ chọn một số ký tự Unicode để chúng ánh xạ tới và các ký tự chúng chọn là các ký tự Unicode có cùng số. U+0081 và U+008D. Điều này giống như những gì Latin-1 làm và các ký tự kết quả có xu hướng rơi vào một phạm vi Unicode dành riêng cho các ký tự kiểm soát Latin-1 đã lỗi thời.

Những codec cẩu thả này cho phép Python làm điều tương tự, do đó tương tác với các phần mềm khác hoạt động theo cách này. Nó định nghĩa một phiên bản cẩu thả của nhiều mã hóa byte đơn có lỗ hổng. (Không cần phiên bản mã hóa cẩu thả không có lỗ. ví dụ: không có thứ gọi là sloppy-iso-8859-2 hoặc sloppy-macroman. )

Các mã hóa sau sẽ được xác định

  • sloppy-windows-1250 (Trung Âu, dựa trên ISO-8859-2)

  • cẩu thả-windows-1251 (Cyrillic)

  • sloppy-windows-1252 (Tây Âu, dựa trên Latin-1)

  • sloppy-windows-1253 (tiếng Hy Lạp, dựa trên ISO-8859-7)

  • sloppy-windows-1254 (tiếng Thổ Nhĩ Kỳ, dựa trên ISO-8859-9)

  • sloppy-windows-1255 (tiếng Do Thái, dựa trên ISO-8859-8)

  • cẩu thả-windows-1256 (tiếng Ả Rập)

  • sloppy-windows-1257 (Baltic, dựa trên ISO-8859-13)

  • sloppy-windows-1258 (tiếng Việt)

  • cẩu thả-cp874 (tiếng Thái, dựa trên ISO-8859-11)

  • sloppy-iso-8859-3 (Tôi đoán là tiếng Malta và Esperanto)

  • cẩu thả-iso-8859-6 (tiếng Ả Rập khác)

  • cẩu thả-iso-8859-7 (tiếng Hy Lạp)

  • cẩu thả-iso-8859-8 (tiếng Do Thái)

  • cẩu thả-iso-8859-11 (tiếng Thái)

Các bí danh như “sloppy-cp1252” cho “sloppy-windows-1252” cũng sẽ được xác định

Năm trong số các mã hóa này (

>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>
0 đến
>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>
1) được sử dụng trong ftfy

Dưới đây là một số ví dụ, sử dụng để minh họa cách sloppy-windows-1252 hợp nhất Windows-1252 với Latin-1

>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>

>>> explain_unicode(some_bytes.decode('windows-1252', 'replace'))
U+20AC  €       [Sc] EURO SIGN
U+FFFD  �       [So] REPLACEMENT CHARACTER
U+201A  ‚       [Ps] SINGLE LOW-9 QUOTATION MARK

>>> explain_unicode(some_bytes.decode('sloppy-windows-1252'))
U+20AC  €       [Sc] EURO SIGN
U+0081  \x81    [Cc] <unknown>
U+201A  ‚       [Ps] SINGLE LOW-9 QUOTATION MARK

Các biến thể của UTF-8

Tệp này xác định một codec có tên là “utf-8-variants” (hoặc “utf-8-var”), có thể giải mã văn bản được mã hóa bằng phiên bản UTF-8 không chuẩn phổ biến. Điều này bao gồm CESU-8, mã hóa ngẫu nhiên được tạo bằng cách xếp lớp UTF-8 lên trên UTF-16, cũng như sự thay đổi của Java trên CESU-8 có chứa mã hóa hai byte cho điểm mã 0

Điều này đặc biệt có liên quan trong Python 3, không cung cấp cách nào khác để giải mã CESU-8

Cách dễ nhất để sử dụng codec là chỉ cần nhập

>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>
1

>>> import ftfy.bad_codecs
>>> result = b'here comes a null! \xc0\x80'.decode('utf-8-var')
>>> print(repr(result).lstrip('u'))
'here comes a null! \x00'

Codec hoàn toàn không thực thi CESU-8 “chính xác”. Ví dụ: mô tả CESU-8 không hoàn toàn theo tiêu chuẩn của Unicode Consortium yêu cầu chỉ có một mã hóa có thể có của bất kỳ ký tự nào, vì vậy nó không cho phép trộn lẫn UTF-8 và CESU-8 hợp lệ. Codec này cho phép điều đó, giống như bộ giải mã UTF-8 của Python 2.

Các ký tự trong Mặt phẳng đa ngôn ngữ cơ bản vẫn chỉ có một bảng mã. Bộ giải mã này vẫn thực thi quy tắc, trong BMP, rằng các ký tự phải xuất hiện ở dạng ngắn nhất của chúng. Có một ngoại lệ. chuỗi byte

>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>
4, thay vì chỉ
>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>
5, có thể được sử dụng để mã hóa ký tự null
>>> from ftfy import explain_unicode
>>> some_bytes = b'\x80\x81\x82'
>>> explain_unicode(some_bytes.decode('latin-1'))
U+0080  \x80    [Cc] <unknown>
U+0081  \x81    [Cc] <unknown>
U+0082  \x82    [Cc] <unknown>
6, giống như trong Java

Nếu bạn mã hóa bằng codec này, bạn sẽ nhận được UTF-8 hợp pháp. Giải mã với codec này và sau đó mã hóa lại không phải là bình thường, mặc dù mã hóa và sau đó giải mã là. Vì vậy, mô-đun này sẽ không tạo CESU-8 cho bạn. Hãy tìm chức năng đó trong mô-đun chị em, “Ngắt văn bản cho bạn”, sẽ không bao giờ xuất hiện

Trong một tình huống khó khăn, bạn có thể giải mã CESU-8 bằng Python 2 bằng cách sử dụng codec UTF-8. đầu tiên giải mã các byte (không chính xác), sau đó mã hóa chúng, sau đó giải mã lại chúng, sử dụng UTF-8 làm codec mỗi lần. Nhưng Python 2 đã chết, vì vậy hãy sử dụng ftfy để thay thế

Python có sử dụng UTF không

Trăn 3. 3 không còn sử dụng UTF-16 nữa, thay vào đó, mã hóa cung cấp biểu diễn nhỏ gọn nhất cho chuỗi đã cho được chọn từ ASCII/Latin-1, UCS-2 và UTF-32. Java ban đầu sử dụng UCS-2 và đã thêm hỗ trợ ký tự bổ sung UTF-16 trong J2SE 5. 0. JavaScript có thể sử dụng UCS-2 hoặc UTF-16.

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

Mã hóa mặc định của tệp nguồn Python là UTF-8 . JSON, TOML, YAML sử dụng UTF-8. Hầu hết các trình soạn thảo văn bản, bao gồm Visual Studio Code và Windows Notepad đều sử dụng UTF-8 theo mặc định.

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

cp1252 hoặc windows-1252 - Mã hóa Tây Âu trên Windows . ASCII - Chỉ các ký tự ASCII . Kể từ Windows 10 phiên bản 1903, UTF-8 là mã hóa mặc định cho Notepad.

Mã hóa ISO 8859 1 Python là gì?

ISO 8859-1 mã hóa cái được gọi là “ Số bảng chữ cái Latinh. 1 ,” bao gồm 191 ký tự từ hệ thống chữ Latinh. Sơ đồ mã hóa ký tự này được sử dụng trên khắp Châu Mỹ, Tây Âu, Châu Đại Dương và phần lớn Châu Phi. Nó cũng thường được sử dụng trong hầu hết các phiên bản Latinh tiêu chuẩn của các ngôn ngữ Đông Á.