Giải mã Python \n
Bạn có một chuỗi rất dài hoặc một chuỗi bao gồm các ký tự thoát dòng mới (\n). Bạn muốn sử dụng Python 3 để tự động xóa các dòng mới được thêm vào đó khỏi chuỗi, danh sách hoặc tệp của bạn Show
Tách dòng mới/ngắt dòng khỏi chuỗi PythonTrong bài đăng này, chúng tôi sẽ phác thảo ba phương pháp mà bạn có thể sử dụng để xóa các dòng mới khỏi một chuỗi. Chúng tôi sẽ thảo luận về từng kỹ thuật và đăng mã ví dụ cho từng trường hợp Sử dụng phương thức dải()Hàm strip() trong Python xóa mọi ký tự theo sau ở đầu và cuối chuỗi. Vì vậy, nếu các đường gạch chéo của bạn nằm trước hoặc sau chuỗi, bạn có thể sử dụng dải () để loại bỏ chúng Mã số
đầu ra
Sử dụng phương thức thay thế()Nếu bạn có một chuỗi chứa nhiều ngắt dòng, bạn có thể sử dụng phương thức thay thế và xóa/thay thế nhiều dòng mới Mã số
đầu ra
Sử dụng phương thức splitlines()Phương thức splitlines() giúp chuyển các dòng thành danh sách chia nhỏ. Do đó, chúng ta có thể tách chuỗi của mình thành một danh sách và sau đó nối nó để tạo thành một giá trị chuỗi Mã số
đầu ra
Thay thế ngắt dòng bằng dấu cáchMột trường hợp phổ biến khác là đặt các khoảng trống thay vì các dòng mới trong một chuỗi. Hãy xem một ví dụ đơn giản
Điều này sẽ trả lại như sau This is a string that i read from a file Hãy thay thế ngắt dòng bằng khoảng trắng và in kết quả ________số 8Điều này sẽ trở lại This is a string that i read from a file Xóa dòng mới khỏi danh sách PythonTheo cách tương tự, bạn có thể dễ dàng loại bỏ các dòng mới khỏi danh sách các chuỗi Giả sử bạn có danh sách sau 0Chúng ta có thể dễ dàng loại bỏ các dòng mới khỏi các phần tử danh sách bằng cách hiểu danh sách và hàm rstrip() 1Đây là kết quả 2Ngoài ra, chúng ta có thể thu được kết quả tương tự bằng cách sử dụng hàm replace() 3Chúng ta cũng có thể thay thế các ký tự xuống dòng bằng một khoảng trắng 4Xóa ngắt dòng khỏi tệpChủ đề cuối cùng của hướng dẫn này là xóa dòng mới khỏi nội dung của tệp văn bản Chúng tôi biết cách đọc tệp văn bản vào danh sách Python bằng readlines(). Trong trường hợp này, chúng ta cần một cách tiếp cận hơi khác. Trước tiên, chúng tôi muốn đọc nội dung của tệp văn bản thành một chuỗi. Điều này có thể dễ dàng thực hiện bằng hàm read() đối tượng tệp. Sau đó, chúng ta có thể thao tác chuỗi khi cần, trong trường hợp này thay thế các ký tự xuống dòng bằng khoảng trắng 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ư 56 và 57. Hướng dẫn này được thiết kế để xóa sương mù 58 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ạoHướ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 cách65 đến 90Các chữ cái trong bảng chữ cái tiếng Anh viết hoa91 đến 96Các biểu đồ bổ sung, chẳng hạn như 96 và 9797 đến 122Các chữ cái trong bảng chữ cái tiếng Anh viết thường123 đến 126Các biểu đồ bổ sung, chẳng hạn như 98 và 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 Ký tự điểm mã (Tên)Ký tự điểm mã (Tên)0NUL (Không)64 911SOH (Bắt đầu tiêu đề)65 922STX (Bắt đầu văn bản)66 933ETX (Kết thúc văn bản)67 944EOT (Kết thúc truyền)68 955ENQ (Truy vấn)69 966ACK (Xác nhận)70 977BEL (Chuông) Loại bỏ các quảng cáoMô-đun This is a string that i read from a file945Mô-đun This is a string that i read from a file945 của Python là một điểm dừng thuận tiện cho các hằng chuỗi nằm trong bộ ký tự của ASCII Đây là cốt lõi của mô-đun trong tất cả vinh quang của nó 26Hầ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ì This is a string that i read from a file947 và This is a string that i read from a file948 Bạn có thể sử dụng các hằng số này để thao tác chuỗi hàng ngày >>> This is a string that i read from a file9 Ghi chú. This is a string that i read from a file949 bao gồm tất cả This is a string that i read from a file950. Đ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à This is a string that i read from a file951, phương pháp này sẽ cho bạn biết rằng không có ký tự nào trong số This is a string that i read from a file952 được coi là có thể in được Sự khác biệt tinh tế là do định nghĩa. This is a string that i read from a file951 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 This is a string that i read from a file954. ” 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ẽ gọi là 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 Thập phân Nhị phân (Nhỏ gọn)Nhị phân (Dạng đệm)00000000001100000001210000000103110000001141000000010051010000010161100000011071110000011181000000010009010010101010101010101010101010101010101010101010101010101010101010101 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ự >>> 38Ghi chú. This is a string that i read from a file957 đã được giới thiệu trong Python 3. 7 Chuỗi f This is a string that i read from a file958 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 5Đâ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ả >>> 9Lý do bạn cần sử dụng mức trần trong This is a string that i read from a file964 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 _______7965 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 >>> 9Tấ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 >>> 9Vấ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 This is a string that i read from a file966 chuyển đổi các chuỗi ASCII thành một biểu diễn byte của 59, trong đó mỗi ký tự tiêu thụ một byte>>> 9Việ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 đến đó, chúng ta hãy nói một chút về các 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 This is a string that i read from a file968 đại diện cho số nào, 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 số mười một Tuy 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 This is a string that i read from a file969 của Python. Nếu bạn chuyển một số từ 59 đến This is a string that i read from a file969, 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 >>> 9Có 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 Loại LiteralPrefixExamplen/an/a This is a string that i read from a file972Binary literal This is a string that i read from a file973 or This is a string that i read from a file974 This is a string that i read from a file975Boctal literal This is a string that i read from a file976 or This is a string that i read from a file977 This is a string that i read from a file978Hex literal This is a string that i read from a file979 or This is a string that i read from a file980 This is a string that i read from a file981 Tất cả đều là các dạng con của số nguyên. Bạn có thể thấy rằng những kết quả này tương ứng tạo ra kết quả tương tự như các lệnh gọi tới This is a string that i read from a file969 với các giá trị This is a string that i read from a file983 không mặc định. Tất cả họ chỉ là 91 với Python>>> 9Đâ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 91DecimalBinaryOctalHex This is a string that i read from a file914 This is a string that i read from a file987 This is a string that i read from a file988 This is a string that i read from a file989 This is a string that i read from a file916 This is a string that i read from a file991 This is a string that i read from a file992 This is a string that i read from a file993 This is a string that i read from a file918 This is a string that i read from a file995 This is a string that i read from a file996 This is a string that i read from a file997 This is a string that i read from a file920 This is a string that i read from a file975 3800 3801This is a string that i read from a file922 3803 3804 3805This is a string that i read from a file924 3807 3808 3809This is a string that i read from a file926 3811 3812 3813This is a string that i read from a file928 3815 3816 3817This is a string that i read from a file930 3819 3820 3821This is a string that i read from a file932 3823This is a string that i read from a file978 3825 3826 3827 3828 3829This is a string that i read from a file972 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856This is a string that i read from a file981 3858 3859 3860 3861 3862_ Số 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 3870 của bạn và kiểm tra việc sử dụng các ký tự hex như thế nàyThis is a string that i read from a file90 Điều này sẽ hoạt động trên bất kỳ hệ thống Unix nào có 3871. Bạn có thể sử dụng 3872 để tìm kiếm các ký tự bát phân hoặc “\b0b” để tìm kiếm các ký tự nhị phânĐối số cho việc sử dụng các cú pháp văn học 91 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 3874 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ố bảng mã 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 3875 hệ 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 đồ (giống như một 3876) hoặc một bảng cơ sở dữ liệu 2 cột. Nó ánh xạ các ký tự (như 3877, 3878 hoặc thậm chí 3879) 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 59 của Python 3 có nghĩa là đại diện cho 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 90 đại diện cho dữ liệu nhị phân hoặc chuỗi 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 Trong 3882 và 3883, tham số 3884 là 3885 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>>> This is a string that i read from a file91 Kết quả của 3886 là một đối tượng. Cả ký tự byte (chẳng hạn như 3888) 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 3889, 3890 tương thích ASCII được phép biểu diễn như hiện tại, nhưng n với dấu ngã được thoát thành 3891. Chuỗi trông lộn xộn đó đại diện cho hai byte, 3892 và 3893 ở dạng hex>>> This is a string that i read from a file92 Nghĩa là, ký tự 3894 yêu cầu hai byte để biểu diễn nhị phân theo UTF-8Ghi chú. Nếu bạn nhập 3895, có thể bạn sẽ thấy giá trị mặc định là 3896. Hãy cẩn thận khi loại trừ điều này và chỉ sử dụng 3897, 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à giá trị mặc định của 3884 đối với 513 tích hợp phụ thuộc vào nền tảng và phụ thuộc vào giá trị của 514>>> This is a string that i read from a file93 Mộ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 >>> This is a string that i read from a file94 UTF-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 >>> This is a string that i read from a file95 Đây là một tính năng tinh tế nhưng quan trọng của 515
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 518 đến 519U. S. ASCII 520, 521, 522, 523128 to 2047 524 to 525Most Latinic alphabets* 526, 527, 528, 5292048 to 65535 530 to 531Additional parts of the multilingual plane (BMP)** 532, 533, 534, 53565536 to 1114111 536 to 537Other*** 538 *Chẳng hạn như tiếng Anh, tiếng Ả Rập, tiếng Hy Lạp và tiếng Ireland 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 >>> This is a string that i read from a file96 Trong 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 59 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 90 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ể >>> This is a string that i read from a file97 Lý do cho điều này là các điểm mã trong phạm vi 544 đến 545 (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 FunctionSignatureAcceptsReturn TypePurpose 546 575Varies 59ASCII chỉ đại diện cho một đối tượng, với các ký tự không phải ASCII được thoát 547 578 579 59Biểu diễn nhị phân của một số nguyên, với tiền tố _______1581 548 583_______1584 585 586Varies 90Coerce (convert) the input to 90, raw binary data 549 590 591 592 593 59Convert an integer code point to a single Unicode character 550 596 579 59Hexadecimal representation of an integer, with the prefix 599This is a string that i read from a file969 901 902Varies 91Coerce (convert) the input to 91 552 906 579 59Octal representation of an integer, with the prefix 909This is a string that i read from a file960 911 912 913 91Convert a single Unicode character to its integer code point 554 916 917Varies 59Coerce (convert) the input to 59, textBạ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 546 cung cấp cho bạn một biểu diễn chỉ ASCII của một đối tượng, với các ký tự không phải ASCII được thoát>>> This is a string that i read from a file98 Ví dụ. bin()Hiện/Ẩn 547 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ố 581>>> This is a string that i read from a file99 Ví dụ. bytes()Hiện/Ẩn 548 buộc đầu vào thành 90, đại diện cho dữ liệu nhị phân thô>>> 380Ví dụ. chr()Hiện/Ẩn 549 chuyển đổi một điểm mã số nguyên thành một ký tự Unicode>>> 381Ví dụ. hex()Hiện/Ẩn 550 đưa ra biểu diễn thập lục phân của một số nguyên, với tiền tố 599>>> 382Ví dụ. int()Hiện/Ẩn This is a string that i read from a file969 ép buộc đầu vào thành 91, tùy ý diễn giải đầu vào trong một cơ sở nhất định>>> 383Ví dụ. ord()Hiện/Ẩn Hàm Python This is a string that i read from a file960 chuyển đổi một ký tự Unicode thành điểm mã số nguyên của nó >>> 384Ví dụ. str()Hiện/Ẩn 554 buộc đầu vào thành 59, đại diện cho văn bản>>> 385Chuỗi ký tự Python. Cách để lột da một con mèoThay vì sử dụng hàm tạo 554, người ta thường nhập _____159 theo nghĩa đen>>> 386Đ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ể 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 >>> 387Bê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 đủ Chuỗi thoát Ý nghĩa Cách thể hiện 3877 936Ký tự có giá trị bát phân _______1937 938 939Ký tự có giá trị hex 1940 941 942Ký tự có tên 943 trong cơ sở dữ liệu Unicode 944 945Ký tự có giá trị hex 16 bit (2 byte)Đây là một số bằng chứng và xác nhận ở trên >>> 388Bâ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), 962, bạn sẽ thấy rằng nó được liệt kê là có mã 963Làm thế nào để bạn đặt cái này vào 945 hoặc 948? >>> 389Điều này cũng có nghĩa là biểu mẫu 948 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ư 969 thành thứ mà Python có thể làm việc với. Nó sử dụng 970>>> 50Loạ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 971 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 đề 972 và không có mã hóa nào khác được chỉ định, thì 971Nó nằm sâu trong tài liệu về mô-đun 974, 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 khác cần lưu ý, đó là 975. Nếu bạn có một 59 đã được giải mã và muốn nhanh chóng nhận được một biểu diễn theo nghĩa đen Unicode đã thoát của nó, thì bạn có thể chỉ định mã hóa này trong 3882>>> 51Bạ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 mà bạn nhận được vào 90 và luôn giải mã bằng cách sử dụng 979 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>>> 52Có 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 >>> 53ồ ồ. Có một 56 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>>> 54chú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 ( 981)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 982, sử dụng phương pháp của Mozilla để đưa ra dự đ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ư 982 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. With newlines: This is my string. After deleting the newlines: This is my string.984Chúng tôi sẽ thiếu sót nếu không đề cập đến 984 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)>>> 55kế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 » Bậc thầy 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 \n có phải là một chuỗi thoát không?Các chuỗi thoát được sử dụng bên trong các chuỗi, không chỉ các chuỗi cho printf, để biểu thị các ký tự đặc biệt. Đặc biệt, chuỗi thoát \n đại diện cho ký tự xuống dòng .
Giải mã () trong Python là gì?Hàm giải mã byte byte() của Python được dùng để chuyển đổi byte thành đối tượng chuỗi . Cả hai chức năng này cho phép chúng tôi chỉ định sơ đồ xử lý lỗi để sử dụng cho lỗi mã hóa/giải mã. Mặc định là 'nghiêm ngặt' có nghĩa là các lỗi mã hóa làm tăng UnicodeEncodeError.
\U trong Python là gì?Trong Python3, chuỗi mặc định được gọi là Chuỗi Unicode (chuỗi u), bạn có thể hiểu chúng là các ký tự mà con người có thể đọc được. Như đã giải thích ở trên, bạn có thể mã hóa chúng thành chuỗi byte (chuỗi b) và chuỗi byte có thể được giải mã trở lại chuỗi Unicode.
Cách kiểm tra utfString encode() Tham số
. Nó trả về một phiên bản được mã hóa utf-8 của chuỗi. Trong trường hợp không thành công, nó sẽ tạo ra một ngoại lệ UnicodeDecodeError. |