Review Giải mã Python

Mẹo Hướng dẫn Giải mã Python Chi Tiết

Bùi Công Duy đang tìm kiếm từ khóa Giải mã Python được Cập Nhật vào lúc : 2022-12-25 05:20:08 . Với phương châm chia sẻ Bí quyết về trong nội dung bài viết một cách Chi Tiết 2022. Nếu sau khi Read nội dung bài viết vẫn ko hiểu thì hoàn toàn có thể lại Comment ở cuối bài để Tác giả lý giải và hướng dẫn lại nha.

HOWTO này thảo luận về sự tương hỗ của Python đối với đặc tả Unicode để màn biểu diễn tài liệu văn bản và lý giải những vấn đề rất khác nhau mà mọi người thường gặp phải khi nỗ lực thao tác với Unicode

Nội dung chính Show
    Giới thiệu về UnicodeCác định nghĩaNgười giới thiệuHỗ trợ Unicode của PythonLoại ChuỗiChuyển đổi sang byteChữ Unicode trong mã nguồn PythonThuộc tính UnicodeSo sánh chuỗiBiểu thức chính quy UnicodeNgười giới thiệuĐọc và ghi tài liệu Unicodetên tệp UnicodeMẹo viết chương trình nhận ra UnicodeNgười giới thiệuSự nhìn nhậnMã hóa () trong Python là gì?Mục đích của phương thức encode() và decode() trong Python là gì?Cách giải thuật UTFSự khác lạ giữa mã hóa và giải thuật Python là gì?

Giới thiệu về Unicode

Các định nghĩa

Các chương trình ngày này cần hoàn toàn có thể xử lý nhiều loại ký tự. Các ứng dụng thường được quốc tế hóa để hiện thông báo và xuất ra nhiều ngôn từ do người tiêu dùng lựa chọn; . Nội dung web hoàn toàn có thể được viết bằng bất kỳ ngôn từ nào trong số này và cũng hoàn toàn có thể gồm có nhiều hình tượng cảm xúc. Kiểu chuỗi của Python sử dụng Tiêu chuẩn Unicode để màn biểu diễn những ký tự, được cho phép những chương trình Python hoạt động và sinh hoạt giải trí với tất cả những ký tự hoàn toàn có thể rất khác nhau này

Unicode (https. //www. unicode. org/) là một đặc điểm kỹ thuật nhằm mục đích mục tiêu liệt kê mọi ký tự được sử dụng bởi ngôn từ của con người và đáp ứng cho từng ký tự một mã duy nhất của riêng nó. Các thông số kỹ thuật Unicode liên tục được sửa đổi và update để thêm những ngôn từ và ký hiệu mới

Một ký tự là thành phần nhỏ nhất hoàn toàn có thể có của một văn bản. 'A', 'B', 'C', v.v. , đều là những ký tự rất khác nhau. 'È' và 'Í' cũng vậy. Các ký tự rất khác nhau tùy thuộc vào ngôn từ hoặc ngữ cảnh mà bạn đang nói đến. Ví dụ: có một ký tự cho “Số một La Mã”, 'Ⅰ', tách biệt với chữ hoa 'I'. Chúng thường trông giống nhau, nhưng đây là hai ký tự rất khác nhau có ý nghĩa rất khác nhau

Tiêu chuẩn Unicode mô tả cách những ký tự được biểu thị bằng những điểm mã. Giá trị điểm mã là một số trong những nguyên trong phạm vi từ 0 đến 0x10FFFF (khoảng chừng 1. 1 triệu giá trị, ít hơn thế). Trong tiêu chuẩn và trong tài liệu này, một điểm mã được viết bằng phương pháp sử dụng ký hiệu

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 4 để chỉ ký tự có mức giá trị try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 5 (9,822 ở dạng thập phân)

Tiêu chuẩn Unicode chứa rất nhiều bảng liệt kê những ký tự và điểm mã tương ứng của chúng

0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ...

Nghiêm túc mà nói, những định nghĩa này ý niệm rằng thật vô nghĩa khi nói 'đây là ký tự

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 4'. try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 4 là một điểm mã, đại diện cho một số trong những ký tự rõ ràng; . Trong toàn cảnh không chính thức, sự khác lạ này Một trong những điểm mã và ký tự đôi khi sẽ bị quên béng

Một ký tự được thể hiện trên màn hình hiển thị hoặc trên giấy bằng một tập hợp những thành phần đồ họa được gọi là glyph. Ví dụ, nét chữ cho chữ hoa A là hai nét chéo và một nét ngang, tuy nhiên những cụ ông cụ bà thể đúng chuẩn sẽ phụ thuộc vào phông chữ được sử dụng. Hầu hết những mã Python tránh việc phải lo ngại về glyphs;

mã hóa

Để tóm tắt phần trước. một chuỗi Unicode là một chuỗi những điểm mã, là những số từ 0 đến

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 8 (1.114.111 thập phân). Chuỗi điểm mã này phải màn biểu diễn trong bộ nhớ dưới dạng một tập hợp những đơn vị mã và sau đó những đơn vị mã được ánh xạ tới những byte 8 bit. Các quy tắc để dịch một chuỗi Unicode thành một chuỗi byte được gọi là mã hóa ký tự hoặc chỉ là mã hóa

Mã hóa đầu tiên bạn hoàn toàn có thể nghĩ đến là sử dụng số nguyên 32 bit làm đơn vị mã, sau đó sử dụng màn biểu diễn của CPU về số nguyên 32 bit. Trong màn biểu diễn này, chuỗi “Python” hoàn toàn có thể trông như vậy này

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23

Biểu diễn này rất đơn giản nhưng sử dụng nó gây ra một số trong những vấn đề

Nó không di động;

Rất tiêu tốn lãng phí không khí. Trong hầu hết những văn bản, phần lớn những điểm mã nhỏ hơn 127 hoặc nhỏ hơn 255, do đó, rất nhiều không khí bị chiếm bởi

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 9 byte. Chuỗi trên chiếm 24 byte so với 6 byte thiết yếu cho màn biểu diễn ASCII. Mức sử dụng RAM tăng lên không thật quan trọng (máy tính để bàn có RAM hàng gigabyte và những chuỗi thường không lớn như vậy), nhưng việc mở rộng mức sử dụng băng thông mạng và đĩa của chúng tôi lên thông số 4 là không thể hoàn toàn có thể đồng ý được

Nó không tương thích với những hàm C hiện có như

répertoire = "/tmp/records.log" with open(répertoire, "w") as f: f.write("testn") 0, vì vậy nên phải sử dụng một nhóm hàm chuỗi rộng mới

Do đó, bảng mã này sẽ không được sử dụng nhiều và thay vào đó mọi người chọn những bảng mã khác hiệu suất cao và tiện lợi hơn, ví dụ như UTF-8

UTF-8 là một trong những bảng mã được sử dụng phổ biến nhất và Python thường mặc định sử dụng nó. UTF là viết tắt của "Định dạng quy đổi Unicode" và '8' nghĩa là những giá trị 8 bit được sử dụng trong mã hóa. (Cũng có bảng mã UTF-16 và UTF-32, nhưng chúng ít được sử dụng hơn UTF-8. ) UTF-8 sử dụng những quy tắc sau

Nếu điểm mã

Nếu điểm mã >= 128, thì nó được chuyển thành một chuỗi gồm hai, ba hoặc bốn byte, trong đó mỗi byte của chuỗi nằm trong khoảng chừng từ 128 đến 255

UTF-8 có một số trong những thuộc tính tiện lợi

Nó hoàn toàn có thể xử lý bất kỳ điểm mã Unicode nào

Một chuỗi Unicode được trở thành một chuỗi byte chỉ chứa những byte 0 được nhúng khi chúng đại diện cho ký tự null (U+0000). Điều này nghĩa là những chuỗi UTF-8 hoàn toàn có thể được xử lý bởi những hàm C như

répertoire = "/tmp/records.log" with open(répertoire, "w") as f: f.write("testn") 1 và được gửi qua những giao thức không thể xử lý những byte bằng 0 cho bất kỳ thứ gì khác ngoài những điểm đánh dấu cuối chuỗi

Một chuỗi văn bản ASCII cũng là văn bản UTF-8 hợp lệ

UTF-8 khá nhỏ gọn;

Nếu byte bị hỏng hoặc bị mất, hoàn toàn có thể xác định điểm khởi đầu của điểm mã được mã hóa UTF-8 tiếp theo và đồng bộ hóa lại. Cũng không chắc chắn là tài liệu 8-bit ngẫu nhiên sẽ in như UTF-8 hợp lệ

UTF-8 là mã hóa hướng byte. Mã hóa chỉ định rằng mỗi ký tự được biểu thị bằng một chuỗi rõ ràng gồm một hoặc nhiều byte. Điều này giúp tránh những vấn đề về thứ tự byte hoàn toàn có thể xảy ra với mã hóa hướng số nguyên và từ, như UTF-16 và UTF-32, trong đó chuỗi byte thay đổi tùy thuộc vào phần cứng mà chuỗi được mã hóa

Người ra mắt

Trang Unicode Consortium có những biểu đồ ký tự, bảng thuật ngữ và những phiên bản PDF của đặc tả Unicode. Hãy sẵn sàng sẵn sàng cho một số trong những bài đọc khó. Niên đại về nguồn gốc và sự phát triển của Unicode cũng luôn có thể có sẵn trên trang web

Trên kênh Youtube Computerphile, Tom Scott nói ngắn gọn về lịch sử của Unicode và UTF-8 (9 phút 36 giây)

Để giúp hiểu tiêu chuẩn, Jukka Korpela đã viết một hướng dẫn ra mắt để đọc những bảng ký tự Unicode

Một bài ra mắt hay khác được viết bởi Joel Spolsky. Nếu phần ra mắt này sẽ không làm rõ mọi thứ với bạn, bạn nên thử đọc nội dung bài viết thay thế này trước khi tiếp tục

Các mục Wikipedia thường hữu ích;

Hỗ trợ Unicode của Python

Bây giờ bạn đã học những kiến ​​thức cơ bản về Unicode, tất cả chúng ta hoàn toàn có thể xem xét những tính năng Unicode của Python

Loại Chuỗi

Kể từ Python 3. 0, loại của ngôn từ chứa những ký tự Unicode, nghĩa là bất kỳ chuỗi nào được tạo bằng phương pháp sử dụng

répertoire = "/tmp/records.log" with open(répertoire, "w") as f: f.write("testn") 3, répertoire = "/tmp/records.log" with open(répertoire, "w") as f: f.write("testn") 4 hoặc cú pháp chuỗi trích dẫn ba lần đều được tàng trữ dưới dạng Unicode

Mã hóa mặc định cho mã nguồn Python là UTF-8, vì vậy bạn chỉ việc đưa một ký tự Unicode vào một chuỗi ký tự

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé")

lưu ý bên lề. Python 3 cũng tương hỗ sử dụng những ký tự Unicode trong mã định danh

________số 8

Nếu bạn không thể nhập một ký tự rõ ràng trong trình sửa đổi của tớ hoặc muốn giữ mã nguồn chỉ ở dạng ASCII vì nguyên do nào đó, bạn cũng hoàn toàn có thể sử dụng những chuỗi thoát trong chuỗi ký tự. (Tùy thuộc vào khối mạng lưới hệ thống của bạn, bạn hoàn toàn có thể thấy nét chữ hoa-đồng bằng thực tế thay vì chữ u thoát. )

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 4

Ngoài ra, người ta hoàn toàn có thể tạo một chuỗi bằng phương pháp sử dụng phương pháp. Phương thức này nhận một đối số mã hóa, ví dụ như

répertoire = "/tmp/records.log" with open(répertoire, "w") as f: f.write("testn") 7 và tùy chọn một đối số lỗi

Đối số lỗi chỉ định phản hồi khi chuỗi đầu vào không thể được quy đổi theo quy tắc mã hóa. Các giá trị pháp lý cho đối số này là

répertoire = "/tmp/records.log" with open(répertoire, "w") as f: f.write("testn") 8 (nêu một ngoại lệ), try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 40 (sử dụng try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 41, try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 42), try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 43 (chỉ việc bỏ ký tự ra khỏi kết quả Unicode) hoặc try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 44 (chèn chuỗi thoát try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 45). Các ví dụ sau đây đã cho tất cả chúng ta biết sự khác lạ

0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ... 3

Mã hóa được chỉ định dưới dạng chuỗi chứa tên mã hóa. Python đi kèm với khoảng chừng 100 bảng mã rất khác nhau; . Một số bảng mã có nhiều tên;

Chuỗi Unicode một ký tự cũng hoàn toàn có thể được tạo bằng hàm tích hợp, lấy số nguyên và trả về chuỗi Unicode có độ dài 1 chứa điểm mã tương ứng. Thao tác ngược lại là hàm tích hợp nhận chuỗi Unicode một ký tự và trả về giá trị điểm mã

0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ... 7

Chuyển đổi sang byte

Phương thức ngược lại của is , trả về một đại diện của chuỗi Unicode, được mã hóa theo mã hóa được yêu cầu

Tham số lỗi in như tham số của phương thức nhưng tương hỗ thêm một số trong những trình xử lý hoàn toàn có thể. Cũng như

répertoire = "/tmp/records.log" with open(répertoire, "w") as f: f.write("testn") 8, try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 43 và try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 40 (trong trường hợp này chèn một dấu chấm hỏi thay vì ký tự không mã hóa được), còn tồn tại 0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ... 38 (chèn một tham chiếu ký tự XML), 0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ... 39 (chèn một chuỗi thoát 0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ... 70) và 0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ... 71 (chèn một

Ví dụ sau đây đã cho tất cả chúng ta biết những kết quả rất khác nhau

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 6

Các quy trình thấp cấp để đăng ký và truy cập những mã hóa có sẵn được tìm thấy trong mô-đun. Việc triển khai mã hóa mới cũng yêu cầu hiểu mô-đun. Tuy nhiên, những hiệu suất cao mã hóa và giải thuật do mô-đun này trả về thường ở mức độ thấp hơn là thoải mái và việc viết mã hóa mới là một trách nhiệm chuyên biệt, vì vậy mô-đun sẽ không được đề cập trong tài liệu HOWTO này

Chữ Unicode trong mã nguồn Python

Trong mã nguồn Python, những điểm mã Unicode rõ ràng hoàn toàn có thể được viết bằng phương pháp sử dụng chuỗi thoát

0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ... 75, theo sau là bốn chữ số thập lục phân cho điểm mã. Chuỗi thoát 0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ... 76 tương tự, nhưng mong đợi tám chữ số hex, không phải bốn

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 9

Sử dụng chuỗi thoát cho những điểm mã to hơn 127 là tốt với liều lượng nhỏ, nhưng sẽ gây rất khó chịu nếu bạn đang sử dụng nhiều ký tự có dấu, in như trong một chương trình có thông báo bằng tiếng Pháp hoặc một số trong những ngôn từ sử dụng dấu khác. Bạn cũng hoàn toàn có thể tập hợp những chuỗi bằng hàm có sẵn, nhưng điều này thậm chí còn tẻ nhạt hơn

Lý tưởng nhất là bạn muốn hoàn toàn có thể viết chữ bằng mã hóa tự nhiên của ngôn từ của tớ. Sau đó, bạn hoàn toàn có thể sửa đổi mã nguồn Python bằng trình sửa đổi yêu thích của tớ, trình sửa đổi này sẽ hiển thị những ký tự có dấu một cách tự nhiên và có những ký tự phù hợp được sử dụng khi chạy

Python tương hỗ viết mã nguồn bằng UTF-8 theo mặc định, nhưng bạn hoàn toàn có thể sử dụng hầu hết mọi mã hóa nếu bạn khai báo mã hóa đang được sử dụng. Điều này được thực hiện bằng phương pháp gồm có một nhận xét đặc biệt ở dòng đầu tiên hoặc dòng thứ hai của tệp nguồn

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 0

Cú pháp được lấy cảm hứng từ ký hiệu của Emacs để chỉ định những biến cục bộ cho một tệp. Emacs tương hỗ nhiều biến rất khác nhau, nhưng Python chỉ tương hỗ 'viết mã'. Các ký hiệu

0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ... 78 cho Emacs biết rằng nhận xét đó là đặc biệt; . Python tìm kiếm 0061 'a'; LATIN SMALL LETTER A 0062 'b'; LATIN SMALL LETTER B 0063 'c'; LATIN SMALL LETTER C ... 007B '{'; LEFT CURLY BRACKET ... 2167 'Ⅷ'; ROMAN NUMERAL EIGHT 2168 'Ⅸ'; ROMAN NUMERAL NINE ... 265E '♞'; BLACK CHESS KNIGHT 265F '♟'; BLACK CHESS PAWN ... 1F600 '😀'; GRINNING FACE 1F609 '😉'; WINKING FACE ... 79 hoặc try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 60 trong phản hồi

Nếu bạn không gồm có nhận xét như vậy, mã hóa mặc định được sử dụng sẽ là UTF-8 như đã đề cập. Xem thêm PEP 263 để biết thêm thông tin

Thuộc tính Unicode

Đặc tả Unicode gồm có một cơ sở tài liệu thông tin về những điểm mã. Đối với mỗi điểm mã được xác định, thông tin gồm mang tên của ký tự, loại của nó, giá trị số nếu có (đối với những ký tự đại diện cho những khái niệm số như chữ số La Mã, phân số như một phần ba và bốn phần năm, v.v. ). Ngoài ra còn tồn tại những thuộc tính liên quan đến hiển thị, ví dụ như cách sử dụng điểm mã trong văn bản hai chiều

Chương trình sau hiển thị một số trong những thông tin về một số trong những ký tự và in giá trị số của một ký tự rõ ràng

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0

Khi chạy, bản in này

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1

Mã khuôn khổ là chữ viết tắt mô tả bản chất của ký tự. Chúng được nhóm thành những khuôn khổ như “Thư”, “Số”, “Dấu chấm câu” hoặc “Ký hiệu”, lần lượt được phân thành những khuôn khổ con. Để lấy những mã từ đầu ra ở trên,

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 61 nghĩa là 'Chữ cái, chữ thường', try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 62 nghĩa là "Số, khác", try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 63 là "Dấu, không phân cách" và try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 64 là "Ký hiệu, khác". Xem list mã khuôn khổ

So sánh chuỗi

Unicode thêm một số trong những phức tạp để so sánh những chuỗi, chính bới cùng một bộ ký tự hoàn toàn có thể được biểu thị bằng những chuỗi điểm mã rất khác nhau. Ví dụ: một vần âm như 'ê' hoàn toàn có thể được biểu thị dưới dạng một điểm mã U+00EA hoặc U+0065 U+0302, là vấn đề mã cho 'e' theo sau là vấn đề mã cho 'DẤU VÒNG KẾT HỢP'. Chúng sẽ tạo ra cùng một đầu ra khi được in, nhưng một là chuỗi có độ dài 1 và chuỗi kia có độ dài 2

Một công cụ để so sánh không phân biệt chữ hoa chữ thường là phương thức chuỗi quy đổi một chuỗi thành dạng không phân biệt chữ hoa chữ thường theo thuật toán được mô tả bởi Tiêu chuẩn Unicode. Thuật toán này còn có cách xử lý đặc biệt đối với những ký tự như vần âm tiếng Đức 'ß' (điểm mã U+00DF), ký tự này trở thành cặp vần âm viết thường 'ss'

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2

Công cụ thứ hai là hiệu suất cao của mô-đun quy đổi những chuỗi thành một trong số những dạng thông thường, trong đó những vần âm theo sau bởi một ký tự phối hợp được thay thế bằng những ký tự đơn lẻ.

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 67 hoàn toàn có thể được sử dụng để thực hiện so sánh chuỗi sẽ không báo cáo sai bất đẳng thức nếu hai chuỗi sử dụng những ký tự phối hợp rất khác nhau

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 3

Khi chạy, kết quả này xuất ra

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 4

Đối số đầu tiên của hàm là một chuỗi đáp ứng dạng chuẩn hóa mong ước, hoàn toàn có thể là một trong 'NFC', 'NFKC', 'NFD' và 'NFKD'

Tiêu chuẩn Unicode cũng chỉ định cách thực hiện so sánh không phân biệt chữ hoa chữ thường

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 5

Điều này sẽ in

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 90. (Tại sao try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 91 được triệu gọi 2 lần? Vì có một số trong những ký tự khiến try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 65 trả về chuỗi không chuẩn hóa nên kết quả cần chuẩn hóa lại. Xem phần 3. 13 của Tiêu chuẩn Unicode để thảo luận và ví dụ. )

Biểu thức chính quy Unicode

Các biểu thức chính quy được mô-đun tương hỗ hoàn toàn có thể được đáp ứng dưới dạng byte hoặc chuỗi. Một số chuỗi ký tự đặc biệt như

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 94 và try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 95 có ý nghĩa rất khác nhau tùy thuộc vào việc mẫu được đáp ứng dưới dạng byte hay chuỗi. Ví dụ: try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 94 sẽ khớp với những ký tự try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 97 theo byte nhưng theo chuỗi sẽ khớp với bất kỳ ký tự nào trong khuôn khổ try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 98

Chuỗi trong ví dụ này còn có số 57 được viết bằng cả chữ số Thái Lan và Ả Rập

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 6

Khi thực hiện,

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 99 sẽ khớp với những chữ số Thái Lan và in chúng ra. Nếu bạn đáp ứng cờ cho , thay vào đó, try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 99 sẽ khớp với chuỗi con “57”

Tương tự,

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 95 khớp với nhiều loại ký tự Unicode nhưng chỉ try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 04 theo byte hoặc nếu được đáp ứng và try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 06 sẽ khớp với ký tự khoảng chừng trắng Unicode hoặc try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 07

Người ra mắt

Một số cuộc thảo luận thay thế tốt về tương hỗ Unicode của Python là

    Xử lý tệp văn bản trong Python 3, bởi Nick Coghlan

    Pragmatic Unicode, một bản trình bày PyCon 2012 của Ned Batchelder

Loại được mô tả trong tài liệu tham khảo thư viện Python tại

Tài liệu về mô-đun

Tài liệu về mô-đun

Marc-André Lemburg đã thuyết trình với tiêu đề “Python và Unicode” (PDF slide) tại EuroPython 2002. Các trang trình bày là một tổng quan tuyệt vời về thiết kế những tính năng Unicode của Python 2 (trong đó loại chuỗi Unicode được gọi là

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 01 và chữ khởi đầu bằng P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 02)

Đọc và ghi tài liệu Unicode

Khi bạn đã viết một số trong những mã hoạt động và sinh hoạt giải trí với tài liệu Unicode, vấn đề tiếp theo là đầu vào/đầu ra. Làm cách nào để bạn đưa những chuỗi Unicode vào chương trình của tớ và làm cách nào để quy đổi Unicode thành một dạng phù hợp để tàng trữ hoặc truyền tải?

Có thể bạn tránh việc phải làm bất kể điều gì tùy thuộc vào nguồn đầu vào và đích đầu ra của bạn; . Trình phân tích cú pháp XML thường trả về tài liệu Unicode, ví dụ. Nhiều cơ sở tài liệu quan hệ cũng tương hỗ những cột có mức giá trị Unicode và hoàn toàn có thể trả về những giá trị Unicode từ truy vấn SQL

Dữ liệu Unicode thường được quy đổi thành một mã hóa rõ ràng trước khi được ghi vào đĩa hoặc gửi qua ổ cắm. Có thể tự mình làm tất cả việc làm. mở một tệp, đọc một đối tượng byte 8 bit từ tệp đó và quy đổi những byte bằng

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 03. Tuy nhiên, cách tiếp cận thủ công không được khuyến khích

Một vấn đề là bản chất mã hóa nhiều byte; . Nếu bạn muốn đọc tệp theo những khối có kích thước tùy ý (ví dụ: 1024 hoặc 4096 byte), bạn cần viết mã xử lý lỗi để nắm bắt trường hợp chỉ một phần của byte mã hóa một ký tự Unicode được đọc ở cuối tệp. . Một giải pháp là đọc toàn bộ tệp vào bộ nhớ và sau đó thực hiện giải thuật, nhưng điều đó ngăn cản bạn thao tác với những tệp cực lớn; . (Hơn nữa, thực sự, vì trong ít nhất một lúc, bạn nên phải có cả chuỗi được mã hóa và phiên bản Unicode của nó trong bộ nhớ. )

Giải pháp sẽ là sử dụng giao diện giải thuật thấp cấp để nắm bắt trường hợp trình tự mã hóa một phần. Công việc thực hiện điều này đã được thực hiện cho bạn. hàm tích hợp hoàn toàn có thể trả về một đối tượng in như tệp giả sử nội dung của tệp ở dạng mã hóa được chỉ định và đồng ý những tham số Unicode cho những phương thức như và. Điều này hoạt động và sinh hoạt giải trí thông qua những tham số mã hóa và lỗi được diễn giải in như những tham số trong và

Do đó, việc đọc Unicode từ một tệp rất đơn giản

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 7

Cũng hoàn toàn có thể mở tệp ở chính sách update, được cho phép đọc và ghi

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 8

Ký tự Unicode

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 10 được sử dụng làm dấu thứ tự byte (BOM) và thường được viết dưới dạng ký tự đầu tiên của tệp để tương hỗ tự động phát hiện thứ tự byte của tệp. Một số mã hóa, ví dụ như UTF-16, yêu cầu BOM xuất hiện ở đầu tệp; . Có những biến thể của những mã hóa này, ví dụ như 'utf-16-le' và 'utf-16-be' đối với mã hóa little-endian và big-endian, chỉ định một thứ tự byte rõ ràng và không bỏ qua BOM

Ở một số trong những khu vực, người ta cũng quy ước sử dụng “BOM” ở đầu những tệp được mã hóa UTF-8; . Dấu chỉ đơn giản thông báo rằng tệp được mã hóa bằng UTF-8. Để đọc những tệp như vậy, hãy sử dụng codec 'utf-8-sig' để tự động bỏ qua dấu nếu có

tên tệp Unicode

Hầu hết những hệ điều hành được sử dụng phổ biến lúc bấy giờ đều tương hỗ tên tệp chứa những ký tự Unicode tùy ý. Thông thường, điều này được thực hiện bằng phương pháp quy đổi chuỗi Unicode thành một số trong những mã hóa rất khác nhau tùy thuộc vào khối mạng lưới hệ thống. Hôm nay Python đang tập trung vào việc sử dụng UTF-8. Python trên MacOS đã sử dụng UTF-8 cho một số trong những phiên bản và Python 3. 6 cũng chuyển sang sử dụng UTF-8 trên Windows. Trên những khối mạng lưới hệ thống Unix, sẽ chỉ có một. nếu bạn đã đặt biến môi trường tự nhiên thiên nhiên

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 11 hoặc P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 12;

Hàm trả về mã hóa để sử dụng trên khối mạng lưới hệ thống hiện tại của bạn, trong trường hợp bạn muốn thực hiện mã hóa theo cách thủ công nhưng không còn nhiều nguyên do để bận tâm. Khi mở một tệp để đọc hoặc ghi, thông thường bạn chỉ việc đáp ứng chuỗi Unicode làm tên tệp và nó sẽ tự động được quy đổi sang bảng mã phù phù phù hợp với bạn

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 9

Các hiệu suất cao trong mô-đun như cũng tiếp tục đồng ý tên tệp Unicode

Hàm trả về tên tệp, điều này gây ra sự cố. nó nên trả về phiên bản Unicode của tên tệp hay nó nên trả về những byte chứa những phiên bản được mã hóa? . Nếu bạn chuyển một chuỗi Unicode làm đường dẫn, tên tệp sẽ được giải thuật bằng mã hóa của khối mạng lưới hệ thống tệp và một list những chuỗi Unicode sẽ được trả về, trong khi chuyển một đường dẫn byte sẽ trả về tên tệp dưới dạng byte. Ví dụ: giả sử mặc định là UTF-8, hãy chạy chương trình sau

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 0

sẽ tạo ra đầu ra sau

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 1

Danh sách đầu tiên chứa tên tệp được mã hóa UTF-8 và list thứ hai chứa những phiên bản Unicode

Lưu ý rằng trong hầu hết những trường hợp, bạn nên làm sử dụng Unicode với những API này. API byte nên làm được sử dụng trên những khối mạng lưới hệ thống mang tên tệp không thể giải thuật được;

Mẹo viết chương trình nhận ra Unicode

Phần này đáp ứng một số trong những gợi ý về cách viết phần mềm xử lý Unicode

Mẹo quan trọng nhất là

Phần mềm nên làm hoạt động và sinh hoạt giải trí với những chuỗi Unicode bên trong, giải thuật tài liệu đầu vào càng sớm càng tốt và chỉ mã hóa đầu ra khi kết thúc

Nếu bạn nỗ lực viết những hàm xử lý đồng ý cả chuỗi Unicode và chuỗi byte, bạn sẽ thấy chương trình của tớ dễ bị lỗi bất kể lúc nào bạn phối hợp hai loại chuỗi rất khác nhau. Không có mã hóa hoặc giải thuật tự động. nếu bạn làm e. g.

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 18, một di chúc được nêu ra

Khi sử dụng tài liệu đến từ trình duyệt web hoặc một số trong những nguồn không đáng tin cậy khác, một kỹ thuật phổ biến là kiểm tra những ký tự không hợp lệ trong chuỗi trước khi sử dụng chuỗi trong dòng lệnh được tạo hoặc tàng trữ trong cơ sở tài liệu. Nếu bạn đang làm điều này, hãy thận trọng kiểm tra chuỗi đã giải thuật, không phải tài liệu byte được mã hóa; . Điều này đặc biệt đúng nếu tài liệu đầu vào cũng chỉ định mã hóa, vì sau đó kẻ tấn công hoàn toàn có thể chọn một cách thông minh để ẩn văn bản độc hại trong dòng byte được mã hóa

Chuyển đổi Một trong những mã hóa tệp

Lớp hoàn toàn có thể quy đổi rõ ràng Một trong những mã hóa, lấy luồng trả về tài liệu ở mã hóa #1 và hoạt động và sinh hoạt giải trí in như luồng trả về tài liệu ở mã hóa #2

Ví dụ: nếu bạn có tệp đầu vào f ở dạng Latinh-1, bạn hoàn toàn có thể bọc tệp đó bằng a để trả về những byte được mã hóa bằng UTF-8

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 2Tệp trong mã hóa không xác định

Bạn hoàn toàn có thể làm gì nếu cần thực hiện thay đổi đối với tệp nhưng không biết mã hóa của tệp?

try: with open('/tmp/input.txt', 'r') as f: ... except OSError: # 'File not found' error message. print("Fichier non trouvé") 3

Trình xử lý lỗi

P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 22 sẽ giải thuật mọi byte không phải ASCII dưới dạng những điểm mã trong một phạm vi đặc biệt chạy từ U+DC80 đến U+DCFF. Các điểm mã này sau đó sẽ trở lại thành những byte giống nhau khi trình xử lý lỗi P y t h o n 0x50 00 00 00 79 00 00 00 74 00 00 00 68 00 00 00 6f 00 00 00 6e 00 00 00 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 22 được sử dụng để mã hóa tài liệu và ghi lại tài liệu đó

Người ra mắt

Một phần của Mastering Python 3 Input/Output, một bài nói chuyện về PyCon 2010 của David Beazley, thảo luận về xử lý văn bản và xử lý tài liệu nhị phân

Các slide PDF cho bài thuyết trình của Marc-André Lemburg “Viết ứng dụng nhận ra Unicode bằng Python” thảo luận về những thắc mắc về mã hóa ký tự cũng như cách quốc tế hóa và bản địa hóa ứng dụng. Các slide này gồm có Python 2. chỉ x

The Guts of Unicode in Python là một bài nói chuyện tại PyCon 2013 của Benjamin Peterson thảo luận về cách màn biểu diễn Unicode bên trong trong Python 3. 3

Sự nhìn nhận

Bản thảo đầu tiên của tài liệu này được viết bởi Andrew Kuchling. Kể từ đó, nó đã được sửa đổi thêm bởi Alexander Belopolsky, Georg Brandl, Andrew Kuchling và Ezio Melotti

Cảm ơn những người dân sau đây đã lưu ý lỗi hoặc đưa ra đề xuất về nội dung bài viết này. Éric Araujo, Nicholas Bastin, Nick Coghlan, Marius Gedminas, Kent Johnson, Ken Krugler, Marc-André Lemburg, Martin von Löwis, Terry J. Diễn viên: ReedySerhiy StorchakaEryk SunChad WhitacreGraham Wideman

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

Phương thức encode() mã hóa chuỗi, sử dụng mã hóa đã chỉ định . Nếu không còn mã hóa nào được chỉ định, UTF-8 sẽ được sử dụng.

Mục đích của phương thức encode() và decode() trong Python là gì?

Để màn biểu diễn một chuỗi unicode dưới dạng một chuỗi byte được gọi là mã hóa. Để quy đổi một chuỗi byte thành chuỗi unicode được gọi là giải thuật.

Cách giải thuật UTF

Bộ giải thuật UTF8 . Nhấn một nút – nhận văn bản được mã hóa UTF 8. Không có quảng cáo, vô nghĩa hoặc rác. Hoạt động với chuỗi ASCII và Unicode. paste your UTF8-encoded data in the form below, press the UTF8 Decode button, and you'll get back the original text. Press a button – get UTF8-decoded text. No ads, nonsense, or garbage. Works with ASCII and Unicode strings.

Sự khác lạ giữa mã hóa và giải thuật Python là gì?

Bằng Python. Trong ngôn từ lập trình Python, mã hóa đại diện cho chuỗi Unicode dưới dạng chuỗi byte . Điều này thường xảy ra khi bạn chuyển phiên bản qua mạng hoặc lưu phiên bản đó vào tệp đĩa. Giải mã quy đổi một chuỗi byte thành một chuỗi Unicode. Tải thêm tài liệu liên quan đến nội dung bài viết Giải mã Python programming python

Clip Giải mã Python ?

Bạn vừa Read nội dung bài viết Với Một số hướng dẫn một cách rõ ràng hơn về Review Giải mã Python tiên tiến nhất

Chia Sẻ Link Cập nhật Giải mã Python miễn phí

Người Hùng đang tìm một số trong những Chia SẻLink Tải Giải mã Python Free.

Hỏi đáp thắc mắc về Giải mã Python

Nếu sau khi đọc nội dung bài viết Giải mã Python vẫn chưa hiểu thì hoàn toàn có thể lại Comment ở cuối bài để Mình lý giải và hướng dẫn lại nha #Giải #mã #Python