Hướng dẫn how to type symbols in python - cách gõ ký hiệu trong python
Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để làm sâu sắc thêm sự hiểu biết của bạn: Unicode in Python: Làm việc với mã hóa ký tự This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Unicode in Python: Working With Character Encodings Show
Xử lý mã hóa ký tự trong Python hoặc bất kỳ ngôn ngữ nào khác có thể có vẻ đau đớn. Những nơi như Stack Overflow có hàng ngàn câu hỏi xuất phát từ sự nhầm lẫn về các ngoại lệ như 4 và 5. Hướng dẫn này được thiết kế để xóa sương mù 6 và minh họa rằng làm việc với dữ liệu văn bản và nhị phân trong Python 3 có thể là một trải nghiệm suôn sẻ. Hỗ trợ của Python sườn Unicode rất mạnh mẽ và mạnh mẽ, nhưng phải mất một thời gian để làm chủ.Hướng dẫn này là khác nhau bởi vì nó không phải là ngôn ngữ-bất khả tri mà thay vào đó là cố tình trung tâm. Bạn vẫn sẽ nhận được một đoạn mồi không liên tục ngôn ngữ, nhưng sau đó bạn sẽ đi sâu vào các hình minh họa trong Python, với các đoạn văn nặng về văn bản được giữ ở mức tối thiểu. Bạn có thể thấy cách sử dụng các khái niệm mã hóa ký tự trong mã Python trực tiếp. Đến cuối hướng dẫn này, bạn sẽ:
Các hệ thống mã hóa và đánh số ký tự được kết nối chặt chẽ đến mức chúng cần được đề cập trong cùng một hướng dẫn hoặc nếu không thì việc điều trị của một trong hai sẽ hoàn toàn không đủ. Những gì một nhân vật mã hóa?Có hàng chục nếu không phải hàng trăm mã hóa nhân vật. Cách tốt nhất để bắt đầu hiểu những gì chúng là bao gồm một trong những mã hóa nhân vật đơn giản nhất, ASCII. Cho dù bạn tự học hay có nền tảng khoa học máy tính chính thức, rất có thể bạn đã thấy một bảng ASCII một hoặc hai lần. ASCII là một nơi tốt để bắt đầu tìm hiểu về mã hóa ký tự vì nó là một mã hóa nhỏ và có chứa. (Quá nhỏ, hóa ra.) Nó bao gồm những điều sau đây:
Vậy một định nghĩa chính thức hơn về mã hóa ký tự là gì? Ở cấp độ rất cao, nó có một cách dịch các ký tự (như chữ cái, dấu câu, ký hiệu, khoảng trắng và ký tự điều khiển) sang số nguyên và cuối cùng là các bit. Mỗi ký tự có thể được mã hóa thành một chuỗi các bit duy nhất. Đừng lo lắng nếu bạn run rẩy về khái niệm bit, bởi vì chúng tôi sẽ sớm nhận được chúng. Các loại khác nhau được phác thảo đại diện cho các nhóm ký tự. Mỗi ký tự duy nhất có một điểm mã tương ứng, mà bạn có thể nghĩ là chỉ là một số nguyên. Các ký tự được phân đoạn thành các phạm vi khác nhau trong bảng ASCII:code point, which you can think of as just an integer. Characters are segmented into different ranges within the ASCII table:
Toàn bộ bảng ASCII chứa 128 ký tự. Bảng này ghi lại bộ ký tự hoàn chỉnh mà ASCII cho phép. Nếu bạn không thấy một nhân vật ở đây, thì bạn chỉ cần thể hiện nó dưới dạng văn bản in theo sơ đồ mã hóa ASCII.character set that ASCII permits. If you don’t see a character here, then you simply can’t express it as printed text under the ASCII encoding scheme.
Mô -đun >>> import string >>> s = "What's wrong with ASCII?!?!?" >>> s.rstrip(string.punctuation) 'What's wrong with ASCII' 43Mô-đun Python sườn 43 là một cửa một cửa thuận tiện cho các hằng số chuỗi rơi vào bộ ký tự ASCII.Ở đây, cốt lõi của mô -đun trong tất cả vinh quang của nó:
Hầu hết các hằng số này nên tự ghi chép trong tên định danh của chúng. Chúng tôi sẽ bao gồm những gì 45 và 46 trong thời gian ngắn.Bạn có thể sử dụng các hằng số này để thao tác chuỗi hàng ngày: >>>
Một chút bồi dưỡngBây giờ là thời điểm tốt cho việc bồi dưỡng ngắn về bit, đơn vị thông tin cơ bản nhất mà máy tính biết.bit, the most fundamental unit of information that a computer knows. Một chút là một tín hiệu chỉ có hai trạng thái có thể. Có nhiều cách khác nhau để thể hiện một chút một chút mà tất cả đều có nghĩa là cùng một điều:
Bảng ASCII của chúng tôi từ phần trước sử dụng những gì bạn và tôi sẽ gọi các số (0 đến 127), nhưng những gì được gọi chính xác hơn là các số trong cơ sở 10 (thập phân). Bạn cũng có thể thể hiện từng số cơ sở này với một chuỗi bit (cơ sở 2). Dưới đây là các phiên bản nhị phân từ 0 đến 10 trong thập phân:
Lưu ý rằng khi số thập phân N tăng, bạn cần các bit quan trọng hơn để thể hiện ký tự được thiết lập và bao gồm cả số đó.significant bits to represent the character set up to and including that number. Ở đây, một cách tiện dụng để đại diện cho các chuỗi ASCII như các chuỗi bit trong Python. Mỗi ký tự từ chuỗi ASCII được mã hóa giả thành 8 bit, với khoảng trắng ở giữa các chuỗi 8 bit mà mỗi người đại diện cho một ký tự duy nhất: >>>
Một chút bồi dưỡng
0 hoặc 1 "có hay không" 47 hoặc 48
"bật hoặc tắt"
Nhị phân (nhỏ gọn) Nhị phân (dạng đệm) >>>
Một chút bồi dưỡng >>>
Tất cả điều này phục vụ để chứng minh một khái niệm: ASCII, nói đúng, một mã 7 bit. Bảng ASCII mà bạn đã thấy ở trên chứa 128 điểm và ký tự mã, bao gồm từ 0 đến 127. Điều này đòi hỏi 7 bit: >>>
Vấn đề với điều này là các máy tính hiện đại don don lưu trữ nhiều thứ trong các khe 7 bit. Họ lưu lượng truy cập theo đơn vị 8 bit, được gọi là một byte.byte. Điều này có nghĩa là không gian lưu trữ được ASCII sử dụng là nửa trống. Nếu nó không rõ lý do tại sao điều này, hãy nghĩ lại bảng thập phân đến nhị phân từ trên cao. Bạn có thể diễn đạt số 0 và 1 chỉ với 1 bit hoặc bạn có thể sử dụng 8 bit để diễn đạt chúng lần lượt là 00000000 và 00000001. Bạn có thể biểu thị các số từ 0 đến 3 chỉ với 2 bit hoặc 00 đến 11 hoặc bạn có thể sử dụng 8 bit để diễn đạt chúng dưới dạng 00000000, 00000001, 00000010 và 00000011, tương ứng. Điểm mã ASCII cao nhất, 127, chỉ yêu cầu 7 bit đáng kể. Biết được điều này, bạn có thể thấy rằng 57 chuyển đổi chuỗi ASCII thành đại diện 7 của byte, trong đó mọi nhân vật tiêu thụ một byte:>>>
ASCII, việc sử dụng không đúng cách các byte 8 bit được cung cấp bởi các máy tính hiện đại đã dẫn đến một gia đình mã hóa không chính thức, mâu thuẫn mà mỗi ký tự bổ sung được chỉ định sẽ được sử dụng với 128 điểm mã có sẵn còn lại được phép trong sơ đồ mã hóa ký tự 8 bit. Không chỉ các mã hóa khác nhau này đụng độ với nhau, mà mỗi người trong số chúng vẫn là một đại diện không hoàn chỉnh của các nhân vật thế giới, bất kể thực tế là họ đã sử dụng thêm một bit. Trong những năm qua, một nhân vật mã hóa Mega-Scheme đã đến để cai trị tất cả. Tuy nhiên, trước khi chúng tôi đến đó, hãy để nói chuyện trong một phút về các hệ thống đánh số, đây là một nền tảng cơ bản của các sơ đồ mã hóa ký tự. Bao gồm tất cả các cơ sở: các hệ thống số khácTrong cuộc thảo luận về ASCII ở trên, bạn đã thấy rằng mỗi ký tự ánh xạ tới một số nguyên trong phạm vi từ 0 đến 127. Phạm vi số này được thể hiện trong thập phân (cơ sở 10). Đó là cách mà bạn, tôi và những người còn lại của chúng ta đã quen với việc đếm, không có lý do phức tạp hơn chúng ta có 10 ngón tay. Nhưng có những hệ thống đánh số khác cũng đặc biệt phổ biến trong suốt mã nguồn CPython. Mặc dù số cơ bản của người Viking là giống nhau, nhưng tất cả các hệ thống đánh số chỉ là những cách khác nhau để thể hiện cùng một số. Nếu tôi hỏi bạn số nào chuỗi 59 đại diện cho, bạn sẽ đúng khi cho tôi một cái nhìn kỳ lạ trước khi trả lời rằng nó đại diện cho mười một.Tuy nhiên, biểu diễn chuỗi này có thể diễn đạt các số cơ bản khác nhau trong các hệ thống đánh số khác nhau. Ngoài thập phân, các lựa chọn thay thế bao gồm các hệ thống đánh số phổ biến sau:
Nhưng chúng ta nói rằng, trong một hệ thống đánh số nhất định, các con số được thể hiện trong cơ sở n? Đây là cách tốt nhất mà tôi biết để nói rõ điều này có nghĩa là gì: đó là số lượng ngón tay mà bạn đã tính đến trong hệ thống đó. Nếu bạn muốn có một giới thiệu đầy đủ hơn nhưng vẫn nhẹ nhàng về các hệ thống đánh số, mã Charles Petzold, là một cuốn sách cực kỳ tuyệt vời khám phá các nền tảng của mã máy tính một cách chi tiết. Một cách để chứng minh làm thế nào các hệ thống đánh số khác nhau diễn giải cùng một điều với hàm tạo Python từ 60. Nếu bạn chuyển 7 đến 60, Python sẽ giả định theo mặc định rằng chuỗi thể hiện một số trong cơ sở 10 trừ khi bạn nói với nó khác:>>>
Có một cách phổ biến hơn để nói với Python rằng số nguyên của bạn được gõ vào một cơ sở khác 10. Python chấp nhận các dạng theo nghĩa đen của mỗi trong số 3 hệ thống đánh số thay thế ở trên:literal forms of each of the 3 alternative numbering systems above:
Tất cả đều là các dạng phụ của các chữ số nguyên. Bạn có thể thấy rằng chúng tạo ra các kết quả tương tự, tương ứng, khi các cuộc gọi đến 60 với các giá trị không mặc định 74. Tất cả họ chỉ là 9 cho Python:integer literals. You can see that these produce the same results, respectively, as the calls to 60 with non-default 74 values. They’re all just 9 to Python:>>>
Ở đây, cách bạn có thể nhập các loại tương đương nhị phân, bát phân và thập lục phân của các số thập phân từ 0 đến 20. Bất kỳ loại nào hoàn toàn có giá trị trong shell thông dịch viên Python hoặc mã nguồn và tất cả đều hoạt động để loại 9:
Thật tuyệt vời khi các biểu thức này phổ biến như thế nào trong thư viện tiêu chuẩn Python. Nếu bạn muốn tự mình nhìn thấy, hãy điều hướng đến bất cứ nơi nào thư mục 61 của bạn nằm và kiểm tra việc sử dụng các nghĩa đen như thế này: 0Điều này sẽ hoạt động trên bất kỳ hệ thống Unix nào có 62. Bạn có thể sử dụng 63 để tìm kiếm nghĩa đen hoặc chữ \ b0b, để tìm kiếm văn bản nhị phân.
Những gì đối số cho việc sử dụng các cú pháp theo nghĩa đen 9 này? Nói tóm lại, đó là vì vì 2, 8 và 16 đều là sức mạnh của 2, trong khi 10 thì không. Ba hệ thống số thay thế này thỉnh thoảng cung cấp một cách để thể hiện các giá trị theo cách thân thiện với máy tính. Ví dụ, số 65536 hoặc 216, chỉ là 10000 trong thập lục phân, hoặc 65 dưới dạng một nghĩa đen hình lục giác.Nhập UnicodeNhư bạn đã thấy, vấn đề với ASCII là nó gần như không phải là một bộ nhân vật đủ lớn để phù hợp với bộ ngôn ngữ, phương ngữ, biểu tượng và glyphs của thế giới. (Nó thậm chí không đủ lớn cho một mình tiếng Anh.) Unicode về cơ bản phục vụ mục đích tương tự như ASCII, nhưng nó chỉ bao gồm một cách, cách, cách tập hợp các điểm mã lớn hơn. Có một số ít các mã hóa xuất hiện theo trình tự thời gian giữa ASCII và Unicode, nhưng chúng không thực sự đáng được đề cập đến vì Unicode và một trong những sơ đồ mã hóa của nó, UTF-8, đã được sử dụng chủ yếu. Hãy nghĩ về Unicode như một phiên bản lớn của bảng ASCII, một người có 1.114.112 điểm mã có thể. Đó là 0 đến 1.114.111, hoặc 0 đến 17 * (216) - 1 hoặc 66 Hexadecimal. Trong thực tế, ASCII là một tập hợp con hoàn hảo của Unicode. 128 ký tự đầu tiên trong bảng Unicode tương ứng chính xác với các ký tự ASCII mà bạn đã mong đợi một cách hợp lý.Vì lợi ích của việc chính xác về mặt kỹ thuật, bản thân Unicode không phải là một mã hóa. Thay vào đó, Unicode được triển khai bởi các mã hóa ký tự khác nhau mà bạn sẽ thấy sớm. Unicode được coi là bản đồ tốt hơn (một cái gì đó như 67) hoặc bảng cơ sở dữ liệu 2 cột. Nó ánh xạ các ký tự (như 68, 69 hoặc thậm chí 70) thành các số nguyên dương, khác biệt. Một mã hóa nhân vật cần cung cấp thêm một chút.Unicode itself is not an encoding. Rather, Unicode is implemented by different character encodings, which you’ll see soon. Unicode is better thought of as a map (something like a 67) or a
2-column database table. It maps characters (like 68, 69, or even 70) to distinct, positive integers. A character encoding needs to offer a bit more.Unicode chứa hầu như mọi nhân vật mà bạn có thể tưởng tượng, bao gồm cả những người không thể in bổ sung. Một trong những mục yêu thích của tôi là dấu hiệu từ phải sang trái, có mã điểm 8207 và được sử dụng trong văn bản với cả các tập lệnh ngôn ngữ từ trái sang phải và từ phải, chẳng hạn như một bài viết có chứa cả đoạn văn tiếng Anh và tiếng Ả Rập . Unicode vs UTF-8Nó đã không mất nhiều thời gian để mọi người nhận ra rằng tất cả các nhân vật trên thế giới không thể được đóng gói thành một byte. Nó rõ ràng từ đó rằng các mã hóa hiện đại, toàn diện hơn sẽ cần sử dụng nhiều byte để mã hóa một số ký tự. Bạn cũng thấy ở trên rằng Unicode không phải là một mã hóa ký tự toàn diện. Tại sao vậy? Có một điều mà Unicode không nói với bạn: Nó không cho bạn biết làm thế nào để có được các bit thực tế từ văn bản chỉ các điểm mã. Nó không cho bạn biết đủ về cách chuyển đổi văn bản thành dữ liệu nhị phân và ngược lại. Unicode là một tiêu chuẩn mã hóa trừu tượng, không phải là mã hóa. Đó là nơi mà UTF-8 và các chương trình mã hóa khác xuất hiện. Tiêu chuẩn Unicode (Bản đồ các ký tự cho các điểm mã) xác định một số mã hóa khác nhau từ bộ ký tự đơn của nó. UTF-8 cũng như anh em họ ít sử dụng hơn, UTF-16 và UTF-32, là các định dạng mã hóa để đại diện cho các ký tự Unicode dưới dạng dữ liệu nhị phân của một hoặc nhiều byte trên mỗi ký tự. Chúng tôi sẽ thảo luận về UTF-16 và UTF-32 trong một khoảnh khắc, nhưng UTF-8 đã chiếm phần chia sẻ lớn nhất của chiếc bánh. Điều đó đưa chúng ta đến một định nghĩa đã quá hạn lâu. Nó có nghĩa là gì, chính thức, để mã hóa và giải mã?encode and decode? Mã hóa và giải mã trong Python 3Loại Python 3 7 có nghĩa là đại diện cho văn bản có thể đọc được của con người và có thể chứa bất kỳ ký tự Unicode nào.Loại 8, ngược lại, đại diện cho dữ liệu nhị phân hoặc chuỗi byte thô, bản chất không có mã hóa được gắn vào nó.Mã hóa và giải mã là quá trình đi từ cái này sang cái khác: Mã hóa so với giải mã (Hình ảnh: Python thật)Trong 73 và 74, tham số 75 là 76 theo mặc định, mặc dù nó thường an toàn hơn và không rõ ràng hơn để chỉ định nó:>>> 1Kết quả của 77 là một đối tượng 8. Cả hai byte theo nghĩa đen (như 79) và các biểu diễn của byte chỉ cho phép các ký tự ASCII.Đây là lý do tại sao, khi gọi 80, tương thích ASCII 81 được phép được biểu diễn như nó là, nhưng N với Tilde được thoát đến 82. Trình tự trông lộn xộn đó đại diện cho hai byte, 83 và 84 trong hex:>>> 2Kết quả của 77 là một đối tượng 8. Cả hai byte theo nghĩa đen (như 79) và các biểu diễn của byte chỉ cho phép các ký tự ASCII.Đây là lý do tại sao, khi gọi >>> def make_bitseq(s: str) -> str: ... if not s.isascii(): ... raise ValueError("ASCII only allowed") ... return " ".join(f"{ord(i):08b}" for i in s) >>> make_bitseq("bits") '01100010 01101001 01110100 01110011' >>> make_bitseq("CAPS") '01000011 01000001 01010000 01010011' >>> make_bitseq("$25.43") '00100100 00110010 00110101 00101110 00110100 00110011' >>> make_bitseq("~5") '01111110 00110101' 80, tương thích ASCII >>> def make_bitseq(s: str) -> str: ... if not s.isascii(): ... raise ValueError("ASCII only allowed") ... return " ".join(f"{ord(i):08b}" for i in s) >>> make_bitseq("bits") '01100010 01101001 01110100 01110011' >>> make_bitseq("CAPS") '01000011 01000001 01010000 01010011' >>> make_bitseq("$25.43") '00100100 00110010 00110101 00101110 00110100 00110011' >>> make_bitseq("~5") '01111110 00110101' 81 được phép được biểu diễn như nó là, nhưng N với Tilde được thoát đến >>> def make_bitseq(s: str) -> str: ... if not s.isascii(): ... raise ValueError("ASCII only allowed") ... return " ".join(f"{ord(i):08b}" for i in s) >>> make_bitseq("bits") '01100010 01101001 01110100 01110011' >>> make_bitseq("CAPS") '01000011 01000001 01010000 01010011' >>> make_bitseq("$25.43") '00100100 00110010 00110101 00101110 00110100 00110011' >>> make_bitseq("~5") '01111110 00110101' 82. Trình tự trông lộn xộn đó đại diện cho hai byte, >>> def make_bitseq(s: str) -> str: ... if not s.isascii(): ... raise ValueError("ASCII only allowed") ... return " ".join(f"{ord(i):08b}" for i in s) >>> make_bitseq("bits") '01100010 01101001 01110100 01110011' >>> make_bitseq("CAPS") '01000011 01000001 01010000 01010011' >>> make_bitseq("$25.43") '00100100 00110010 00110101 00101110 00110100 00110011' >>> make_bitseq("~5") '01111110 00110101' 83 và >>> def make_bitseq(s: str) -> str: ... if not s.isascii(): ... raise ValueError("ASCII only allowed") ... return " ".join(f"{ord(i):08b}" for i in s) >>> make_bitseq("bits") '01100010 01101001 01110100 01110011' >>> make_bitseq("CAPS") '01000011 01000001 01010000 01010011' >>> make_bitseq("$25.43") '00100100 00110010 00110101 00101110 00110100 00110011' >>> make_bitseq("~5") '01111110 00110101' 84 trong hex:Đó là, ký tự 85 yêu cầu hai byte cho biểu diễn nhị phân của nó theo UTF-8.
Mô -đun Python từ 93 mặc định là cờ 94 thay vì 95. Điều này có nghĩa là, ví dụ, 96 phù hợp với các ký tự từ Unicode, không chỉ các chữ cái ASCII.>>> 3Kết quả của 77 là một đối tượng 8. Cả hai byte theo nghĩa đen (như 79) và các biểu diễn của byte chỉ cho phép các ký tự ASCII.Đây là lý do tại sao, khi gọi >>> def make_bitseq(s: str) -> str: ... if not s.isascii(): ... raise ValueError("ASCII only allowed") ... return " ".join(f"{ord(i):08b}" for i in s) >>> make_bitseq("bits") '01100010 01101001 01110100 01110011' >>> make_bitseq("CAPS") '01000011 01000001 01010000 01010011' >>> make_bitseq("$25.43") '00100100 00110010 00110101 00101110 00110100 00110011' >>> make_bitseq("~5") '01111110 00110101' 80, tương thích ASCII >>> def make_bitseq(s: str) -> str: ... if not s.isascii(): ... raise ValueError("ASCII only allowed") ... return " ".join(f"{ord(i):08b}" for i in s) >>> make_bitseq("bits") '01100010 01101001 01110100 01110011' >>> make_bitseq("CAPS") '01000011 01000001 01010000 01010011' >>> make_bitseq("$25.43") '00100100 00110010 00110101 00101110 00110100 00110011' >>> make_bitseq("~5") '01111110 00110101' 81 được phép được biểu diễn như nó là, nhưng N với Tilde được thoát đến >>> def make_bitseq(s: str) -> str: ... if not s.isascii(): ... raise ValueError("ASCII only allowed") ... return " ".join(f"{ord(i):08b}" for i in s) >>> make_bitseq("bits") '01100010 01101001 01110100 01110011' >>> make_bitseq("CAPS") '01000011 01000001 01010000 01010011' >>> make_bitseq("$25.43") '00100100 00110010 00110101 00101110 00110100 00110011' >>> make_bitseq("~5") '01111110 00110101' 82. Trình tự trông lộn xộn đó đại diện cho hai byte, >>> def make_bitseq(s: str) -> str: ... if not s.isascii(): ... raise ValueError("ASCII only allowed") ... return " ".join(f"{ord(i):08b}" for i in s) >>> make_bitseq("bits") '01100010 01101001 01110100 01110011' >>> make_bitseq("CAPS") '01000011 01000001 01010000 01010011' >>> make_bitseq("$25.43") '00100100 00110010 00110101 00101110 00110100 00110011' >>> make_bitseq("~5") '01111110 00110101' 83 và >>> def make_bitseq(s: str) -> str: ... if not s.isascii(): ... raise ValueError("ASCII only allowed") ... return " ".join(f"{ord(i):08b}" for i in s) >>> make_bitseq("bits") '01100010 01101001 01110100 01110011' >>> make_bitseq("CAPS") '01000011 01000001 01010000 01010011' >>> make_bitseq("$25.43") '00100100 00110010 00110101 00101110 00110100 00110011' >>> make_bitseq("~5") '01111110 00110101' 84 trong hex:Đó là, ký tự 85 yêu cầu hai byte cho biểu diễn nhị phân của nó theo UTF-8.variable-length encoding. It’s tempting to gloss over what this means, but it’s worth delving into.Python 3: All-in on unicode >>> 4Kết quả của 77 là một đối tượng 8. Cả hai byte theo nghĩa đen (như 79) và các biểu diễn của byte chỉ cho phép các ký tự ASCII.>>> 5Kết quả của 77 là một đối tượng 8. Cả hai byte theo nghĩa đen (như 79) và các biểu diễn của byte chỉ cho phép các ký tự ASCII.
Python 3: All-in on unicode
0 đến 127 def n_possible_values(nbits: int) -> int: return 2 ** nbits 06 đến def n_possible_values(nbits: int) -> int: return 2 ** nbits 07Hoa Kỳ ASCII 08, 09, 10, 11>>> 6128 đến 2047 12 đến 13Hầu hết các bảng chữ cái Latin*
UTF-32 Không 7Một khía cạnh gây tò mò khác của gia đình UTF là UTF-8 sẽ không phải lúc nào cũng chiếm ít không gian hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng nó hoàn toàn có thể: >>> Lý do cho điều này là các điểm mã trong phạm vi 32 đến 33 (2048 đến 65535 trong thập phân) chiếm ba byte trong UTF-8 so với chỉ hai trong UTF-16.Tôi không phải là bất kỳ phương tiện nào khuyến nghị bạn nhảy lên tàu UTF-16, bất kể bạn có hoạt động bằng ngôn ngữ mà các nhân vật thường nằm trong phạm vi này hay không. Trong số các lý do khác, một trong những lập luận mạnh mẽ cho việc sử dụng UTF-8 là, trong thế giới mã hóa, đó là một ý tưởng tuyệt vời để hòa nhập với đám đông.Chưa kể, đó là năm 2019: Bộ nhớ máy tính rẻ, vì vậy hãy tiết kiệm 4 byte bằng cách cố gắng sử dụng UTF-16 được cho là không xứng đáng. Chức năng tích hợp của Python
Bạn đã thực hiện nó thông qua phần khó khăn. Thời gian để sử dụng những gì bạn đã thấy cho đến nay trong Python.
36, 42 và 60 là các hàm tạo lớp cho các loại tương ứng của chúng, 8, 7 và 9. Mỗi người cung cấp các cách ép buộc đầu vào vào loại mong muốn. Chẳng hạn, như bạn đã thấy trước đó, trong khi 55 có lẽ là phổ biến hơn, bạn cũng có thể thấy 56.
7ASCII chỉ đại diện cho một đối tượng, với các ký tự không phải ASCII đã thoát ra Không 8Một khía cạnh gây tò mò khác của gia đình UTF là UTF-8 sẽ không phải lúc nào cũng chiếm ít không gian hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng nó hoàn toàn có thể: Không 9Một khía cạnh gây tò mò khác của gia đình UTF là UTF-8 sẽ không phải lúc nào cũng chiếm ít không gian hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng nó hoàn toàn có thể: Không 0Một khía cạnh gây tò mò khác của gia đình UTF là UTF-8 sẽ không phải lúc nào cũng chiếm ít không gian hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng nó hoàn toàn có thể: Không 1Một khía cạnh gây tò mò khác của gia đình UTF là UTF-8 sẽ không phải lúc nào cũng chiếm ít không gian hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng nó hoàn toàn có thể: Không 2Một khía cạnh gây tò mò khác của gia đình UTF là UTF-8 sẽ không phải lúc nào cũng chiếm ít không gian hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng nó hoàn toàn có thể: Không 3Một khía cạnh gây tò mò khác của gia đình UTF là UTF-8 sẽ không phải lúc nào cũng chiếm ít không gian hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng nó hoàn toàn có thể: Không 4Một khía cạnh gây tò mò khác của gia đình UTF là UTF-8 sẽ không phải lúc nào cũng chiếm ít không gian hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng nó hoàn toàn có thể: Không 5Một khía cạnh gây tò mò khác của gia đình UTF là UTF-8 sẽ không phải lúc nào cũng chiếm ít không gian hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng nó hoàn toàn có thể:>>> Không 6Một khía cạnh gây tò mò khác của gia đình UTF là UTF-8 sẽ không phải lúc nào cũng chiếm ít không gian hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng nó hoàn toàn có thể: >>> 7Bên cạnh việc đặt các ký tự Unicode thực tế, không được phân loại vào bảng điều khiển, có những cách khác để nhập các chuỗi Unicode. Một trong những phần dày đặc nhất của tài liệu Python, là phần về phân tích từ vựng, cụ thể là phần về chuỗi và byte. Cá nhân, tôi đã phải đọc phần này về một, hai, hoặc có thể chín lần để nó thực sự chìm vào. Một phần của những gì nó nói là có tối đa sáu cách mà Python sẽ cho phép bạn nhập cùng một ký tự Unicode. Cách đầu tiên và phổ biến nhất là gõ chính nhân vật theo nghĩa đen, như bạn đã thấy. Phần khó khăn với phương pháp này là tìm các tổ hợp phím thực tế. Đó là nơi mà các phương pháp khác để nhận và đại diện cho các nhân vật phát huy tác dụng. Ở đây, danh sách đầy đủ:
Ở đây, một số bằng chứng và xác nhận của những điều trên: >>> 8Bây giờ, có hai cảnh báo chính:
Chẳng hạn, nếu bạn tham khảo unicode-table.com để biết thông tin về chữ gothic faihu (hoặc FEHU), 50, bạn sẽ thấy rằng nó được liệt kê là có mã 51.Làm thế nào để bạn đặt điều này vào 33 hoặc 36? Chà, bạn có thể phù hợp với nó trong 33 bởi vì nó là một nhân vật 4 byte và sử dụng 36 để thể hiện nhân vật này, bạn sẽ cần phải bỏ qua trình tự:Điều này cũng có nghĩa là mẫu 36 là chuỗi thoát duy nhất có khả năng giữ bất kỳ ký tự unicode nào.Các mã hóa khác có sẵn trong PythonCho đến nay, bạn đã thấy bốn mã hóa nhân vật:
Có rất nhiều người khác ngoài kia. Một ví dụ là Latin-1 (còn được gọi là ISO-8859-1), về mặt kỹ thuật là mặc định cho giao thức chuyển siêu văn bản (HTTP), mỗi RFC 2616. Windows có biến thể Latin-1 riêng được gọi là CP1252. Danh sách đầy đủ các mã hóa được chấp nhận được chôn vùi trong tài liệu cho mô -đun 57, là một phần của thư viện tiêu chuẩn Python.Có một mã hóa được công nhận hữu ích hơn để nhận thức được, đó là 58. Nếu bạn có một 7 được giải mã và muốn nhanh chóng nhận được một đại diện cho chữ Unicode đã thoát ra của nó, thì bạn có thể chỉ định mã hóa này trong 73:>>> 9Bạn biết những gì họ nói về các giả địnhChỉ vì Python đưa ra giả định mã hóa UTF-8 cho các tệp và mã mà bạn tạo ra không có nghĩa là bạn, lập trình viên, nên hoạt động với cùng một giả định về dữ liệu bên ngoài. Hãy để nói điều đó một lần nữa bởi vì nó là một quy tắc để sống bằng cách: khi bạn nhận được dữ liệu nhị phân (byte) từ nguồn bên thứ ba, cho dù đó là từ một tệp hoặc qua mạng, thực tế tốt nhất là kiểm tra xem dữ liệu chỉ định mã hóa. Nếu nó không có, thì nó sẽ hỏi bạn. Tất cả I/O xảy ra trong byte, không phải văn bản và byte chỉ là những cái và số không cho máy tính cho đến khi bạn nói với nó bằng cách thông báo về mã hóa. Ở đây, một ví dụ về nơi mọi thứ có thể đi sai. Bạn đã đăng ký API gửi cho bạn một công thức trong ngày mà bạn nhận được trong 8 và luôn được giải mã bằng cách sử dụng 62 mà không có vấn đề gì. Vào ngày đặc biệt này, một phần của công thức trông như thế này:>>> 0Có vẻ như công thức gọi một số bột, nhưng chúng tôi không biết bao nhiêu: >>> 1Uh oh. Có một số người mắc bệnh 4 có thể cắn bạn khi bạn đưa ra các giả định về mã hóa. Bạn kiểm tra với máy chủ API. Lo và kìa, dữ liệu thực sự được gửi qua được mã hóa trong Latin-1:>>> 2Chúng tôi đi ở đó. Trong Latin-1, mọi nhân vật đều phù hợp với một byte duy nhất, trong khi ký tự ¼ ¼ chiếm hai byte trong UTF-8 ( 64).Bài học ở đây là nó có thể nguy hiểm khi cho rằng việc mã hóa bất kỳ dữ liệu nào được gửi cho bạn. Nó thường là UTF-8 trong những ngày này, nhưng nó có tỷ lệ nhỏ trong các trường hợp mà nó không phải là điều đó sẽ thổi bay mọi thứ. Nếu bạn thực sự cần phải từ bỏ tàu và đoán mã hóa, thì hãy xem thư viện 65, sử dụng phương pháp từ Mozilla để đưa ra một phỏng đoán có giáo dục về văn bản được mã hóa mơ hồ. Điều đó nói rằng, một công cụ như 65 nên là phương sách cuối cùng của bạn, không phải đầu tiên của bạn.Tỷ lệ cược và kết thúc: >>> from math import ceil, log >>> def n_bits_required(nvalues: int) -> int: ... return ceil(log(nvalues) / log(2)) >>> n_bits_required(256) 8 67Chúng tôi sẽ không đề cập đến 67 từ Thư viện tiêu chuẩn Python, cho phép bạn tương tác và tra cứu trên cơ sở dữ liệu ký tự Unicode (UCD):>>> 3
Gói lênTrong bài viết này, bạn đã giải mã chủ đề rộng rãi và áp đặt mã hóa nhân vật trong Python. Bạn đã bao phủ rất nhiều mặt đất ở đây:
Bây giờ, đi ra và mã hóa! Tài nguyênĐể biết thêm chi tiết về các chủ đề được đề cập ở đây, hãy xem các tài nguyên này:
Các tài liệu Python có hai trang về chủ đề:
Xem bây giờ hướng dẫn này có một khóa học video liên quan được tạo bởi nhóm Python thực sự. Xem nó cùng với hướng dẫn bằng văn bản để làm sâu sắc thêm sự hiểu biết của bạn: Unicode in Python: Làm việc với mã hóa ký tự This tutorial has a related video course created by the Real Python team. Watch it together with the written tutorial to deepen your understanding: Unicode in Python: Working With Character Encodings Làm thế nào để bạn gõ các ký tự đặc biệt vào Python?Trong các chuỗi Python, dấu gạch chéo ngược "\" là một nhân vật đặc biệt, còn được gọi là nhân vật "Escape".Nó được sử dụng để thể hiện các ký tự khoảng trắng nhất định: "\ t" là một tab, "\ n" là một dòng mới và "\ r" là một sự trở lại vận chuyển.Ngược lại, tiền tố một ký tự đặc biệt với "\" biến nó thành một ký tự thông thường.the backslash "\" is a special character, also called the "escape" character. It is used in representing certain whitespace characters: "\t" is a tab, "\n" is a newline, and "\r" is a carriage return. Conversely, prefixing a special character with "\" turns it into an ordinary character.
Tôi có thể sử dụng các biểu tượng trong Python không?Các biểu tượng bây giờ có thể được thao tác bằng cách sử dụng một số toán tử Python: +, -`, ``*, ** (Số học), &, |, ~, >>, <(Boolean).
Làm thế nào để tôi có được Unicode trong Python?Trong Python, các hàm tích hợp tích hợp chr () và ord () được sử dụng để chuyển đổi giữa các điểm và ký tự mã Unicode.Một ký tự cũng có thể được biểu diễn bằng cách viết một điểm mã unicode thập lục phân với \ x, \ u hoặc \ u theo nghĩa đen của chuỗi.chr() and ord() are used to convert between Unicode code points and characters. A character can also be represented by writing a hexadecimal Unicode code point with \x , \u , or \U in a string literal.
Làm thế nào để bạn in các ký tự đặc biệt trong Python?Làm thế nào để bạn hiển thị các nhân vật đặc biệt trong Python?Sử dụng repr () để in các ký tự đặc biệt gọi repr (chuỗi) để trả về chuỗi với các ký tự đặc biệt thoát ra.Use repr() to print special characters Call repr(string) to return string with special characters escaped. |