Làm cách nào để thay đổi mã hóa của chuỗi trong python?
Xử lý mã hóa ký tự trong Python hoặc bất kỳ ngôn ngữ nào khác đôi khi có vẻ khó khăn. Những nơi như Stack Overflow có hàng nghìn câu hỏi bắt nguồn từ sự nhầm lẫn về các ngoại lệ như 6 và 7. Hướng dẫn này được thiết kế để xóa sương mù 8 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ợ Unicode của Python rất mạnh mẽ và mạnh mẽ, nhưng phải mất một thời gian để thành thạo Show
Hướng dẫn này khác biệt bởi vì nó không phải là ngôn ngữ bất khả tri mà thay vào đó, có chủ ý lấy Python làm trung tâm. Bạn vẫn sẽ nhận được phần mở đầu không liên quan đến ngôn ngữ, nhưng sau đó, bạn sẽ đi sâu vào các hình minh họa bằng Python, với các đoạn văn bản nặng được giữ ở mức tối thiểu. Bạn sẽ 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 đánh số và mã hóa ký tự được kết nối chặt chẽ với nhau đến mức chúng cần được đề cập trong cùng một hướng dẫn, nếu không việc xử lý một trong hai sẽ hoàn toàn không thỏa đáng Ghi chú. Bài viết này là Python 3 trung tâm. Cụ thể, tất cả các ví dụ về mã trong hướng dẫn này được tạo từ một CPython 3. 7. 2 shell, mặc dù tất cả các phiên bản nhỏ của Python 3 sẽ hoạt động (hầu hết) giống nhau trong cách xử lý văn bản của chúng Nếu bạn vẫn đang sử dụng Python 2 và bị đe dọa bởi sự khác biệt trong cách Python 2 và Python 3 xử lý dữ liệu văn bản và dữ liệu nhị phân, thì hy vọng hướng dẫn này sẽ giúp bạn thực hiện chuyển đổi Tải xuống miễn phí. Nhận một chương mẫu từ Thủ thuật Python. Cuốn sách chỉ cho bạn các phương pháp hay nhất về Python với các ví dụ đơn giản mà bạn có thể áp dụng ngay lập tức để viết mã Pythonic + đẹp hơn Mã hóa ký tự là gì?Có hàng chục nếu không muốn nói là hàng trăm mã hóa ký tự. Cách tốt nhất để bắt đầu hiểu chúng là gì là bao gồm một trong những bảng mã ký tự đơn giản nhất, ASCII Cho dù bạn là người tự học hay có kiến thức cơ bản về khoa học máy tính, rất có thể bạn đã nhìn thấy 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ì đây 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ì 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, đó là cách dịch các ký tự (chẳng hạn như chữ cái, dấu chấm 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à bit. Mỗi ký tự có thể được mã hóa thành một chuỗi bit duy nhất. Đừng lo lắng nếu bạn không nắm vững khái niệm về bit, vì chúng ta sẽ sớm tìm hiểu về chúng Các danh mục khác nhau được phác thảo đại diện cho các nhóm ký tự. Mỗi ký tự đơn có một điểm mã tương ứng mà bạn có thể coi như 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 Phạm vi điểm mã Lớp từ 0 đến 31Ký tự điều khiển/không in được32 đến 64Dấu câu, ký hiệu, số và khoảng trắng65 đến 90Các chữ cái trong bảng chữ cái tiếng Anh viết hoa từ 91 đến 96Các biểu đồ bổ sung, chẳng hạn như 6 và 797 đến 122Các chữ cái trong bảng chữ cái tiếng Anh viết thường từ 123 đến 126Các biểu đồ bổ sung, chẳng hạn như 8 và 9127Kiểm soát/không phải Toàn bộ bảng ASCII chứa 128 ký tự. Bảng này nắm bắt bộ ký tự hoàn chỉnh mà ASCII cho phép. Nếu bạn không thấy một ký tự ở đây, thì đơn giản là bạn không thể diễn đạt ký tự đó dưới dạng văn bản in theo sơ đồ mã hóa ASCII Bảng ASCIIHiển thị/Ẩn Code PointCharacter (Name)Code PointCharacter (Name)0NUL (Null)64 11SOH (Start of Heading)65 22STX (Start of Text)66 33ETX (End of Text)67 44EOT (End of Transmission)68 55ENQ (Enquiry)69 66ACK (Acknowledgment)70 77BEL (Bell)71 88BS (Backspace)72 99HT (Horizontal Tab)73 010LF (Line Feed)74 111VT (Vertical Tab)75 212FF (Form Feed)76 313CR (Carriage Return)77 414SO (Shift Out)78 515SI (Shift In)79 616DLE (Data Link Escape)80 717DC1 (Device Control 1)81 818DC2 (Device Control 2)82 919DC3 (Device Control 3)83 020DC4 (Device Control 4)84 121NAK (Negative Acknowledgment)85 222SYN (Synchronous Idle)86 323ETB (End of Transmission Block)87 424CAN (Cancel)88 525EM (End of Medium)89 626SUB (Substitute)90 727ESC (Escape)91 628FS (File Separator)92 729GS (Group Separator)93 030RS (Record Separator)94 131US (Unit Separator)95 232SP (Space)96 333 497 534 698 735 899 936 0100 137 2101 338 4102 539 6103 740 8104 941 00105 0142 02106 0343 04107 0544 06108 0745 08109 0946 10110 1147 12111 1348 14112 1549 16113 1750 18114 1951 20115 2152 22116 2353 24117 2554 26118 2755 28119 2956 30120 3157 32121 3358 34122 3559 36123 860 38124 961 40125 4162 42126 4363 44127DEL (delete)Loại bỏ các quảng cáoMô-đun >>> import string >>> s = "What's wrong with ASCII?!?!?" >>> s.rstrip(string.punctuation) 'What's wrong with ASCII' 45Mô-đun Python 45 là một điểm dừng thuận tiện cho các hằng chuỗi nằm trong bộ ký tự ASCIIĐây là 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 phải tự ghi lại tên định danh của chúng. Chúng tôi sẽ sớm đề cập đến những gì 47 và 48Bạn có thể sử dụng các hằng số này để thao tác chuỗi hàng ngày >>>
Ghi chú. 49 bao gồm tất cả 50. Điều này hơi khác với một phương pháp khác để kiểm tra xem một ký tự có được coi là có thể in được hay không, cụ thể là 51, phương pháp này sẽ cho bạn biết rằng không có ký tự nào trong số 52 được coi là có thể in đượcSự khác biệt tinh tế là do định nghĩa. 51 coi thứ gì đó có thể in được nếu “tất cả các ký tự của nó được coi là có thể in được trong 54. ”Một chút bồi dưỡngBây giờ là thời điểm tốt để ôn lại một chút, đơn vị thông tin cơ bản nhất mà máy tính biết Một bit là tín hiệu chỉ có hai trạng thái có thể. Có nhiều cách khác nhau để biểu diễn một cách tượng trưng một chút mà tất cả đều có nghĩa giống nhau
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ẽ chỉ 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ể biểu thị từng số trong số cơ số 10 này bằng 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 ở dạng thập phân DecimalBinary (Compact)Binary (Padded Form)0000000000110000000121000000010311000000114100000001005101000001016110000001107111000001118100000001000910010000100110101000001010 Lưu ý rằng khi số thập phân n tăng lên, bạn cần nhiều bit quan trọng hơn để biểu thị ký tự được thiết lập và bao gồm cả số đó Đây là một cách tiện dụng để biểu diễn các chuỗi ASCII dưới dạng 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 các khoảng trắng ở giữa các chuỗi 8 bit, mỗi ký tự đại diện cho một ký tự >>>
Ghi chú. 57 đã được giới thiệu trong Python 3. 7Chuỗi f 58 sử dụng Python, đây là cách chỉ định định dạng cho các trường thay thế trong chuỗi định dạng
Thủ thuật này chủ yếu chỉ để giải trí và nó sẽ thất bại nặng nề đối với bất kỳ ký tự nào mà bạn không thấy có trong bảng ASCII. Chúng ta sẽ thảo luận về cách mã hóa khác khắc phục sự cố này sau Loại bỏ các quảng cáoChúng tôi cần thêm bitCó một công thức cực kỳ quan trọng liên quan đến định nghĩa của một bit. Cho một số bit, n, số lượng các giá trị riêng biệt có thể có có thể được biểu diễn trong n bit là 2n
Đây là ý nghĩa của nó
Có một hệ quả tất yếu cho công thức này. được cung cấp một phạm vi các giá trị riêng biệt có thể, làm thế nào chúng ta có thể tìm thấy số bit, n, cần thiết để phạm vi được biểu diễn đầy đủ? Đây là những gì hiệu quả >>>
Lý do bạn cần sử dụng mức trần trong 64 là để tính đến các giá trị không phải là lũy thừa sạch của 2. Giả sử bạn cần lưu trữ một bộ ký tự gồm 110 ký tự. Ngây thơ, điều này sẽ mất __64_______ 65 bit, nhưng không có thứ gọi là 0. 781 bit. 110 giá trị sẽ yêu cầu 7 bit, không phải 6, với các vị trí cuối cùng là không cần thiết>>>
Tất cả điều này phục vụ để chứng minh một khái niệm. Nói đúng ra, ASCII là mã 7 bit. Bảng ASCII mà bạn đã thấy ở trên chứa 128 điểm mã và ký tự, bao gồm từ 0 đến 127. Điều này yêu cầu 7 bit >>>
Vấn đề với điều này là các máy tính hiện đại không lưu trữ nhiều thứ trong các khe cắm 7 bit. Chúng lưu lượng theo đơn vị 8 bit, thường được gọi là byte Ghi chú. Trong suốt hướng dẫn này, tôi giả định rằng một byte đề cập đến 8 bit, như nó đã có từ những năm 1960, chứ không phải là một số đơn vị lưu trữ khác. Bạn có thể gọi đây là một octet nếu bạn thích Điều này có nghĩa là không gian lưu trữ được sử dụng bởi ASCII trống một nửa. Nếu không rõ tại sao lại như vậy, hãy xem lại bảng thập phân sang nhị phân ở trên. Bạn có thể biểu thị các số 0 và 1 chỉ bằng 1 bit hoặc bạn có thể sử dụng 8 bit để biểu thị 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ỉ bằng 2 bit hoặc 00 đến 11 hoặc bạn có thể sử dụng 8 bit để biểu thị chúng lần lượt là 00000000, 00000001, 00000010 và 00000011. Điểm mã ASCII cao nhất, 127, chỉ yêu cầu 7 bit quan trọng Khi biết điều này, bạn có thể thấy rằng 66 chuyển đổi các chuỗi ASCII thành một đại diện 9 byte, trong đó mỗi ký tự tiêu thụ một byte>>>
Việc sử dụng không đúng mức các byte 8 bit của ASCII do các máy tính hiện đại cung cấp đã dẫn đến một nhóm mã hóa không chính thức, xung đột mà mỗi ký tự bổ sung được chỉ định sẽ được sử dụng với 128 điểm mã khả dụng còn lại được cho phép trong sơ đồ mã hóa ký tự 8 bit Các mã hóa khác nhau này không chỉ xung đột với nhau mà bản thân mỗi mã hóa này vẫn là một đại diện hoàn toàn không hoàn chỉnh của các ký tự trên thế giới, bất kể thực tế là chúng đã sử dụng một bit bổ sung. Trong những năm qua, một kế hoạch lớn mã hóa một ký tự đã thống trị tất cả. Tuy nhiên, trước khi chúng ta đến đó, chúng ta hãy nói một phút về hệ thống đánh số, đây là nền tảng cơ bản của sơ đồ mã hóa ký tự Loại bỏ các quảng cáoBao gồm tất cả các cơ sở. Hệ thống số khácTrong phần 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 khoảng từ 0 đến 127 Phạm vi số này được biểu thị bằng số thập phân (cơ số 10). Đó là cách mà bạn, tôi và phần còn lại của con người chúng ta đã quen đếm, không có lý do gì phức tạp hơn việc chúng ta có 10 ngón tay Nhưng cũng có những hệ thống đánh số khác đặc biệt phổ biến trong toàn bộ mã nguồn CPython. Mặc dù “số bên dưới” giống nhau, nhưng tất cả các hệ thống đánh số chỉ là những cách khác nhau để biểu thị cùng một số Nếu tôi hỏi bạn chuỗi 68 đại diện cho số nào, bạn sẽ có lý khi nhìn tôi một cách kỳ lạ trước khi trả lời rằng nó đại diện cho số mười mộtTuy nhiên, biểu diễn chuỗi này có thể biểu thị các số cơ bản khác nhau trong các hệ thống đánh số khác nhau. Ngoài số 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 đây
Nhưng điều đó có ý nghĩa gì đối với chúng ta khi nói rằng, trong một hệ thống đánh số nhất định, các số được biểu diễ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 có thể tin tưởng trong hệ thống đó Nếu bạn muốn có phần giới thiệu đầy đủ hơn nhưng vẫn nhẹ nhàng về các hệ thống đánh số, Charles Petzold’s Code là một cuốn sách cực kỳ hay, khám phá chi tiết nền tảng của mã máy tính Một cách để chứng minh cách các hệ thống đánh số khác nhau giải thích cùng một điều là sử dụng hàm tạo 69 của Python. Nếu bạn chuyển 9 đến 69, Python sẽ mặc định cho rằng chuỗi biểu thị một số trong cơ số 10 trừ khi bạn nói khác đi>>>
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 nhập vào một cơ số khác 10. Python chấp nhận các dạng chữ của mỗi trong số 3 hệ thống đánh số thay thế ở trên Type of LiteralPrefixExamplen/an/a 72Binary literal 73 or 74 75Octal literal 76 or 77 78Hex literal 79 or 80 81Tất cả đều là các dạng con của số nguyên. Bạn có thể thấy rằng những điều này tạo ra kết quả tương tự, tương ứng, như các cuộc gọi đến ____64_______69 với các giá trị _______64___83 không mặc định. Tất cả họ chỉ là 1 đối với Python>>>
Đây là cách bạn có thể nhập số nhị phân, bát phân và thập lục phân tương đương của các số thập phân từ 0 đến 20. Bất kỳ thứ nào trong số này đều hoàn toàn hợp lệ trong trình biên dịch Python hoặc mã nguồn và tất cả đều thuộc loại 1DecimalBinaryOctalHex 14 87 88 89 16 91 92 93 18 95 96 97 20 75 00 01 22 03 04 05 24 07 08 09 26 11 12 13 28 15 16 17 30 19 20 21 32 23 78 25 26 27 28 29 72 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 81 58 59 60 61 62 63 64 65 66 67 68 69Số nguyên trong nguồn CPythonHiển thị/Ẩn Thật ngạc nhiên là mức độ phổ biến của các biểu thức này trong Thư viện chuẩn Python. Nếu bạn muốn tự mình xem, hãy điều hướng đến bất kỳ vị trí nào trong thư mục 70 của bạn và kiểm tra việc sử dụng các ký tự hex 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ó 71. Bạn có thể sử dụng 72 để tìm kiếm chữ bát phân hoặc “\b0b” để tìm kiếm chữ nhị phânĐối số cho việc sử dụng các cú pháp văn học 1 thay thế này là gì? . Ba hệ thống số thay thế này đôi khi đưa ra 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 ở dạng thập lục phân hoặc 74 dưới dạng chữ thập lục phân PythonLoại bỏ các quảng cáoNhập UnicodeNhư bạn đã thấy, vấn đề với ASCII là nó gần như không phải là một tập hợp các ký tự đủ lớn để phù hợp với tập hợp ngôn ngữ, phương ngữ, ký hiệu và nét vẽ của thế giới. (Nó thậm chí không đủ lớn cho riêng tiếng Anh. ) Unicode về cơ bản phục vụ cùng một mục đích 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ố 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 vì Unicode và một trong các 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 đồ sộ của bảng ASCII—một phiên bản có 1.114.112 điểm mã có thể. Đó là 0 đến 1.114.111 hoặc 0 đến 17 * (216) - 1 hoặc 75 thập lục phân. Trên thực tế, ASCII là 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ằng các mã hóa ký tự khác nhau mà bạn sẽ sớm thấy. Unicode tốt hơn nên được coi là một bản đồ (chẳng hạn như 76) hoặc bảng cơ sở dữ liệu 2 cột. Nó ánh xạ các ký tự (như 77, 78 hoặc thậm chí 79) thành các số nguyên dương, khác biệt. Mã hóa ký tự cần cung cấp thêm một chútUnicode hầu như chứa mọi ký tự mà bạn có thể tưởng tượng, bao gồm cả những ký tự không in được bổ sung. Một trong những mục yêu thích của tôi là dấu từ phải sang trái phiền phức, có mã điểm 8207 và được sử dụng trong văn bản có cả chữ viết từ trái sang phải và từ phải sang trái, chẳng hạn như một bài viết có cả đoạn văn tiếng Anh và tiếng Ả Rập Ghi chú. Thế giới mã hóa ký tự là một trong nhiều chi tiết kỹ thuật chi tiết mà một số người thích soi mói. Một chi tiết như vậy là chỉ có 1.111.998 điểm mã Unicode thực sự có thể sử dụng được, do một số lý do cổ xưa. Unicode so với UTF-8Không mất nhiều thời gian để mọi người nhận ra rằng tất cả các ký tự trên thế giới không thể gói gọn trong một byte. Rõ ràng là 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ự Ở trên, bạn cũng đã thấy rằng Unicode về mặt kỹ thuật không phải là 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 cách lấy 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ột bảng mã. Đó là nơi UTF-8 và các sơ đồ mã hóa khác phát huy tác dụng. Tiêu chuẩn Unicode (bản đồ các ký tự tới 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ư những người anh em họ ít được sử dụng hơn của nó, UTF-16 và UTF-32, là các định dạng mã hóa để biểu thị 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 ta sẽ thảo luận về UTF-16 và UTF-32 trong giây lát, nhưng UTF-8 đã chiếm thị phần lớn nhất cho đến nay Điều đó đưa chúng ta đến một định nghĩa đã quá hạn. Chính thức, nó có nghĩa là gì để mã hóa và giải mã? Mã hóa và giải mã trong Python 3Loại 9 của Python 3 được dùng để biểu thị văn bản mà con người có thể đọc được và có thể chứa bất kỳ ký tự Unicode nàoNgược lại, loại 0 đại diện cho dữ liệu nhị phân hoặc chuỗi các byte thô, về bản chất không có mã hóa được đính kèm với 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 vs giải mã (Hình ảnh. Trăn thật)Trong 82 và 83, tham số 84 là 85 theo mặc định, mặc dù việc chỉ định nó thường an toàn hơn và rõ ràng hơn>>> 1Kết quả của 86 là một đối tượng. Cả ký tự byte (chẳng hạn như 88) và biểu diễn byte chỉ cho phép các ký tự ASCIIĐây là lý do tại sao, khi gọi ________123_____89, tương thích ASCII 90. Chuỗi trông lộn xộn đó đại diện cho hai byte, 92 và 93 ở dạng hex>>> 2Nghĩa là, ký tự 94 yêu cầu hai byte để biểu diễn nhị phân theo UTF-8Ghi chú. Nếu bạn nhập 95, có thể bạn sẽ thấy giá trị mặc định là 96. Hãy cẩn thận khi loại trừ điều này và chỉ sử dụng 97, vì mặc định trong Windows trước Python 3. 6Loại bỏ các quảng cáoTrăn 3. Tất tay trên UnicodePython 3 hoàn toàn phù hợp với Unicode và UTF-8 cụ thể. Đây là ý nghĩa của nó
Có một thuộc tính khác có nhiều sắc thái hơn, đó là _____123_______84 mặc định cho _____________13 tích hợp sẵn phụ thuộc vào nền tảng và phụ thuộc vào giá trị của ________14 >>> 3Một lần nữa, bài học ở đây là hãy cẩn thận khi đưa ra các giả định khi nói đến tính phổ biến của UTF-8, ngay cả khi đó là mã hóa chiếm ưu thế. Rõ ràng trong mã của bạn không bao giờ gây hại Một byte, hai byte, ba byte, bốnMột tính năng quan trọng là UTF-8 là mã hóa có độ dài thay đổi. Thật hấp dẫn để tìm hiểu điều này có nghĩa là gì, nhưng nó đáng để đi sâu vào Nghĩ lại phần về ASCII. Mọi thứ trong vùng đất mở rộng ASCII đều yêu cầu tối đa một byte dung lượng. Bạn có thể nhanh chóng chứng minh điều này bằng biểu thức trình tạo sau >>> 4UTF-8 khá khác biệt. Một ký tự Unicode nhất định có thể chiếm bất kỳ đâu từ một đến bốn byte. Đây là một ví dụ về một ký tự Unicode duy nhất chiếm bốn byte >>> 5Đây là một tính năng tinh tế nhưng quan trọng của 15
Bảng dưới đây tóm tắt những loại ký tự chung phù hợp với từng nhóm độ dài byte Phạm vi thập phân Phạm vi Hex Bao gồm những gì Ví dụ 0 đến 127 18 đến 19U. S. ASCII 20, 21, 22, 23128 to 2047 24 to 25Most Latinic alphabets* 26, 27, 28, 292048 to 65535 30 to 31Additional parts of the multilingual plane (BMP)** 32, 33, 34, 3565536 to 1114111 36 to 37Other*** 38 * Chẳng hạn như tiếng Anh, tiếng Ả Rập, tiếng Hy Lạp và tiếng Ailen Ghi chú. Để không đánh mất bức tranh toàn cảnh, có một bộ tính năng kỹ thuật bổ sung của UTF-8 không được đề cập ở đây vì chúng hiếm khi hiển thị đối với người dùng Python Chẳng hạn, UTF-8 thực sự sử dụng các mã tiền tố cho biết số lượng byte trong một chuỗi. Điều này cho phép bộ giải mã cho biết byte nào thuộc về nhau trong mã hóa có độ dài thay đổi và cho phép byte đầu tiên đóng vai trò là chỉ báo về số lượng byte trong chuỗi tiếp theo Bài viết UTF-8 của Wikipedia không né tránh các chi tiết kỹ thuật và luôn có Tiêu chuẩn Unicode chính thức để bạn đọc thoải mái. Thế còn UTF-16 và UTF-32 thì sao?Hãy quay lại với hai biến thể mã hóa khác, UTF-16 và UTF-32 Sự khác biệt giữa những điều này và UTF-8 là đáng kể trong thực tế. Dưới đây là ví dụ về mức độ khác biệt lớn với chuyển đổi khứ hồi >>> 6Trong trường hợp này, mã hóa bốn chữ cái Hy Lạp bằng UTF-8 và sau đó giải mã trở lại văn bản bằng UTF-16 sẽ tạo ra một văn bản 9 bằng một ngôn ngữ hoàn toàn khác (tiếng Hàn)Kết quả sai rõ ràng như thế này có thể xảy ra khi cùng một mã hóa không được sử dụng hai chiều. Hai biến thể giải mã cùng một đối tượng 0 có thể tạo ra kết quả thậm chí không cùng ngôn ngữBảng này tóm tắt phạm vi hoặc số byte theo UTF-8, UTF-16 và UTF-32 Mã hóaByte trên mỗi ký tự (Bao gồm)Độ dài thay đổiUTF-81 đến 4CóUTF-162 đến 4CóUTF-324Không Một khía cạnh gây tò mò khác của họ UTF là UTF-8 không phải lúc nào cũng chiếm ít dung lượng hơn UTF-16. Điều đó có vẻ phản trực giác về mặt toán học, nhưng hoàn toàn có thể >>> 7Lý do cho điều này là các điểm mã trong phạm vi 44 đến 45 (2048 đến 65535 ở dạng thập phân) chiếm ba byte trong UTF-8 so với chỉ hai byte trong UTF-16Tôi hoàn toàn không khuyên bạn nên nhảy lên tàu UTF-16, bất kể bạn có hoạt động bằng ngôn ngữ có các ký 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ẽ để sử dụng UTF-8 là, trong thế giới mã hóa, đó là Chưa kể, đó là năm 2019. bộ nhớ máy tính rẻ, vì vậy việc tiết kiệm 4 byte bằng cách sử dụng UTF-16 được cho là không đáng Loại bỏ các quảng cáoCác chức năng tích hợp sẵn của PythonBạn đã vượt qua phần khó khăn. Đã đến lúc sử dụng những gì bạn đã thấy cho đến nay trong Python Python có một nhóm các hàm tích hợp có liên quan theo một cách nào đó đến các hệ thống đánh số và mã hóa ký tự Chúng có thể được nhóm hợp lý với nhau dựa trên mục đích của chúng
Dưới đây là một cái nhìn chi tiết hơn về từng chức năng trong số chín chức năng này HàmChữ kýChấp nhậnKiểu trả vềMục đích 46 75Varies_______0_______9ASCII chỉ đại diện cho một đối tượng, với các ký tự không phải ASCII được thoát 47 78 79 9Biểu diễn nhị phân của một số nguyên, với tiền tố 81 48 83 84 85 86Khác nhau_______4_______0Cưỡng chế (chuyển đổi) đầu vào thành 0, dữ liệu nhị phân thô 49 90 91 92 93_______0_______9Chuyển đổi một điểm mã số nguyên thành một ký tự Unicode duy nhất 50 96 79 9Biểu diễn thập lục phân của một số nguyên, với tiền tố 99 69 01 02Khác nhau 1Cưỡng chế (chuyển đổi) đầu vào thành 1 52 06 79 9Biểu diễn bát phân của một số nguyên, với tiền tố 09 60 11 12 13 1Chuyển đổi một ký tự Unicode thành điểm mã số nguyên của nó_______0_______54 16 17Khác nhau_______0_______9Cưỡng chế (chuyển đổi) đầu vào thành 9, văn bảnBạn có thể mở rộng phần bên dưới để xem một số ví dụ về từng chức năng Ví dụ. ascii()Hiện/Ẩn 46 cung cấp cho bạn biểu diễn đối tượng chỉ ở dạng ASCII, với các ký tự không phải ASCII được thoát>>> 8Ví dụ. bin()Hiện/Ẩn 47 cung cấp cho bạn biểu diễn nhị phân của một số nguyên, với tiền tố 81>>> 9Ví dụ. bytes()Hiện/Ẩn 48 buộc đầu vào thành 0, đại diện cho dữ liệu nhị phân thô>>> 0Ví dụ. chr()Hiện/Ẩn 49 chuyển đổi một điểm mã số nguyên thành một ký tự Unicode>>> 1Ví dụ. hex()Hiện/Ẩn 50 đưa ra biểu diễn thập lục phân của một số nguyên, với tiền tố 99>>> 2Ví dụ. int()Hiện/Ẩn 69 ép buộc đầu vào thành 1, tùy ý diễn giải đầu vào trong một cơ sở nhất định>>> 3Ví dụ. ord()Hiện/Ẩn Hàm 60 của Python chuyển đổi một ký tự Unicode thành điểm mã số nguyên của nó>>> 4Ví dụ. str()Hiện/Ẩn 54 ép đầu vào thành 9, đại diện cho văn bản>>> 5Chuỗi chữ Python. Cách để lột da một con mèoThay vì sử dụng phương thức khởi tạo 54, thông thường người ta sẽ gõ một ____________9 theo nghĩa đen>>> 6Điều đó có vẻ đủ dễ dàng. Nhưng khía cạnh thú vị của mọi thứ là vì Python 3 hoàn toàn lấy Unicode làm trung tâm, bạn có thể “gõ” các ký tự Unicode mà bạn có thể thậm chí sẽ không tìm thấy trên bàn phím của mình. Bạn có thể sao chép và dán quyền này vào trình thông dịch viên Python 3 >>> 7Bên cạnh việc đặt các ký tự Unicode thực tế, không thoát trong bảng điều khiển, còn có nhiều cách khác để nhập 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ề. Cá nhân tôi đã phải đọc phần này khoảng một, hai hoặc có thể chín lần để nó thực sự thấm nhuần. Một phần của những gì nó nói là có tới 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à nhập ký 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 các phương pháp khác để nhận và đại diện cho các ký tự phát huy tác dụng. Đây là danh sách đầy đủ Escape SequenceMeaningHow To Express 77 36Character with octal value 37 38 39Character with hex value 40 41 42Character named 43 in the Unicode database 44 45Character with 16-bit (2-byte) hex value 46 47 48Character with 32-bit (4-byte) hex value 49 50Đây là một số bằng chứng và xác nhận ở trên >>> 8Bây giờ, có hai lưu ý chính
Chẳng hạn, nếu bạn tham khảo bảng unicode. com để biết thông tin về chữ cái Gothic faihu (hoặc fehu), 62, bạn sẽ thấy rằng nó được liệt kê là có mã 63Làm thế nào để bạn đặt điều này vào 45 hoặc 48? >>> 9Điều này cũng có nghĩa là biểu mẫu 48 là chuỗi thoát duy nhất có khả năng chứa bất kỳ ký tự Unicode nàoGhi chú. Đây là một chức năng ngắn để chuyển đổi các chuỗi trông giống như 69 thành thứ mà Python có thể làm việc với. Nó sử dụng 70>>> 0Loại bỏ các quảng cáoMã hóa khác có sẵn trong PythonCho đến nay, bạn đã thấy bốn mã hóa ký tự
Có rất nhiều cá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 truyền siêu văn bản (HTTP), mỗi. Windows có biến thể Latin-1 của riêng mình được gọi là cp1252 Ghi chú. ISO-8859-1 vẫn còn rất nhiều trong tự nhiên. Thư viện 71 tuân theo RFC 2616 “đến từng chữ cái” trong việc sử dụng nó làm mã hóa mặc định cho nội dung của phản hồi HTTP hoặc HTTPS. Nếu từ “văn bản” được tìm thấy trong tiêu đề 72 và không có mã hóa nào khác được chỉ định, thì 71Nó nằm sâu trong tài liệu về mô-đun 74, là một phần của Thư viện chuẩn của PythonCó một mã hóa được công nhận hữu ích hơn cần lưu ý, đó là 75. Nếu bạn có một 9 đã được giải mã và muốn nhanh chóng nhận được biểu diễn của chữ Unicode đã thoát của nó, thì bạn có thể chỉ định mã hóa này trong 82>>> 1Bạn biết họ nói gì về giả định…Chỉ vì Python đưa ra giả định mã hóa UTF-8 cho các tệp và mã mà bạn tạo 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 đối với dữ liệu ngoài Hãy nói điều đó một lần nữa bởi vì đó là một quy tắc để sống theo. khi bạn nhận được dữ liệu nhị phân (byte) từ nguồn của bên thứ ba, cho dù đó là từ tệp hay qua mạng, cách tốt nhất là kiểm tra xem dữ liệu đó có chỉ định mã hóa không. Nếu không, thì bạn phải hỏi Tất cả I/O xảy ra theo byte, không phải văn bản và byte chỉ là số 1 và số 0 đối với máy tính cho đến khi bạn thông báo cho máy tính biết cách khác bằng cách thông báo mã hóa cho máy tính Đây là một ví dụ về nơi mọi thứ có thể đi sai. Bạn đã đăng ký một API sẽ gửi cho bạn công thức nấu ăn trong ngày, bạn sẽ nhận được công thức này vào ngày 0 và luôn giải mã bằng cách sử dụng 79 mà không gặp 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>>> 2Có vẻ như công thức yêu cầu một ít bột mì, nhưng chúng tôi không biết bao nhiêu >>> 3ồ ồ. Có một 6 phiền phức 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. Xin thưa, dữ liệu thực sự được gửi qua mã hóa bằng tiếng Latin-1>>> 4chúng ta đi thôi. Trong , mỗi ký tự khớp với một byte đơn, trong khi ký tự “¼” chiếm hai byte trong UTF-8 ( 81)Bài học ở đây là có thể nguy hiểm khi giả sử mã hóa bất kỳ dữ liệu nào được chuyển cho bạn. Ngày nay, nó thường là UTF-8, nhưng đó là một tỷ lệ nhỏ các trường hợp mà nó không làm nổ tung mọi thứ Nếu bạn thực sự cần phải bỏ tàu và đoán mã hóa, thì hãy xem thư viện 82, sử dụng phương pháp từ Mozilla để đưa ra phỏng đoán có cơ sở về văn bản được mã hóa mơ hồ. Điều đó nói rằng, một công cụ như 82 nên là phương án cuối cùng của bạn, không phải là phương án đầu tiên của bạnLoại bỏ các quảng cáoVụn vặt. >>> from math import ceil, log >>> def n_bits_required(nvalues: int) -> int: .. return ceil(log(nvalues) / log(2)) >>> n_bits_required(256) 8 84Chúng tôi sẽ thiếu sót nếu không đề cập đến 84 từ Thư viện 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)>>> 5kết thúcTrong bài viết này, bạn đã giải mã chủ đề rộng lớn và ấn tượng của mã hóa ký tự trong Python Bạn đã bao phủ rất nhiều nền tảng ở đây
Bây giờ, hãy tiếp tục 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
Tài liệu Python có hai trang về chủ đề này Đánh dấu là đã hoàn thành Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Unicode trong Python. Làm việc với mã hóa ký tự 🐍 Thủ thuật Python 💌 Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python Gửi cho tôi thủ thuật Python » Giới thiệu về Brad Solomon Brad là một kỹ sư phần mềm và là thành viên của Nhóm hướng dẫn Python thực sự » Thông tin thêm về BradMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là Alex Aldren Joanna Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Chuyên gia Kỹ năng Python trong thế giới thực Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bạn nghĩ sao? Đánh giá bài viết này Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì? Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi Làm thế nào để UTFLàm cách nào để chuyển đổi chuỗi thành UTF-8 trong Python? . string1 = "apple" string2 = "Preeti125" string3 = "12345" string4 = "pre@12" sợi dây. mã hóa (mã hóa = 'UTF-8', lỗi = 'nghiêm ngặt') # chuỗi unicode string = 'pythön. ' # mã hóa mặc định thành utf-8 string_utf = string. encode() print('Phiên bản được mã hóa là. ', string_utf) Cách chuyển đổi chuỗi thành UTFĐể chuyển đổi Chuỗi thành UTF-8, chúng tôi sử dụng phương thức getBytes() trong Java . Phương thức getBytes() mã hóa một Chuỗi thành một chuỗi byte và trả về một mảng byte. trong đó charsetName là bộ ký tự cụ thể mà Chuỗi được mã hóa thành một mảng byte.
Mã hóa =' UTF là gì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 chuyển đổi Unicode ”, và '8' có nghĩa là các giá trị 8 bit được sử dụng trong mã hóa.
Làm cách nào để chuyển đổi chuỗi thành Unicode trong Python?Cho một Chuỗi, hãy chuyển các ký tự của nó thành ký tự unicode. . Đầu vào. test_str = 'gfg' đầu ra. \u0067\u0066\u0067 Giải trình. Kết quả thay đổi thành chuỗi unicode Đầu vào. test_str = 'himani' đầu ra. \u0068\u0069\u006D\u0061\u006E\u0069 Giải trình. Kết quả thay đổi thành chuỗi unicode |