Cách xử lý các ký tự unicode trong python

Chúng tôi có thể đọc những dòng văn bản này vì chúng tôi đã quen thuộc với bảng chữ cái Latinh với 26 ký tự được sử dụng trong tiếng Anh. Các ngôn ngữ khác có các ký tự riêng và tất cả chúng đều cần được mã hóa để máy tính của chúng tôi có thể biểu diễn chúng. Trong nhiều thập kỷ, máy tính đã có thể biểu diễn các ký tự dựa trên bảng mã ASCII¹

bảng ASCII

ASCII là một tiêu chuẩn gán các chữ cái, số và các ký tự khác trong 256 vị trí có sẵn trong mã 8 bit. Với các ngôn ngữ không sử dụng bảng chữ cái Latinh như tiếng Trung, tiếng Hy Lạp, tiếng Nhật, ASCII sẽ không thể biểu thị các văn bản này và chúng tôi cần một bộ ký tự mới. Chúng là Unicode²

bảng Unicode

Văn bản trong Python có thể được trình bày bằng chuỗi unicode hoặc byte

Mã hóa chuỗi unicode

Hãy định nghĩa một string bằng Python và xem loại của nó

Nó thực sự là một đối tượng thuộc loại str hoặc một chuỗi. Điều gì sẽ xảy ra nếu chúng ta định nghĩa một byte bằng chữ. [Chúng ta có thể sử dụng hàm bytes để chuyển đổi chuỗi thành đối tượng byte]

Chúng tôi cố gắng xác định một đối tượng byte chứa các ký tự không phải ASCII ["Xin chào, Thế giới" bằng tiếng Trung]

Chúng ta có thể định nghĩa một byte bằng chữ b với tiền tố

Nó hiển thị lỗi cho chúng tôi biết rằng trước tiên chúng tôi sẽ cần chuyển đổi chuỗi của mình bằng các ký tự không phải ASCII thành một đối tượng byte

Và chúng tôi sẽ cần cung cấp và mã hóa để thực hiện việc này như sau

Kết quả cho phần này của mã có thể được nhìn thấy hình bên dưới

Cách tốt hơn để giải quyết mã hóa là sử dụng hàm encode[]

Như bạn có thể thấy, chúng tôi đã thu được kết quả tương tự như trước đây

Hãy nhớ rằng theo mặc định Python 3 sử dụng utf-8 để mã hóa

Vì Python 3 mặc định sử dụng utf-8, nên chúng ta sử dụng bảng mã khác như thế nào, chúng ta chỉ cần chuyển nó vào hàm. Ví dụ: chúng tôi có thể mã hóa chuỗi ‘hello world’ của mình thành utf-16 như sau

giải mã byte

Chuỗi Unicode có thể được mã hóa thành byte bằng cách sử dụng một số mã hóa được xác định trước như utf-8, utf-16, v.v. Có thể giải mã byte thành chuỗi unicode, nhưng điều này có thể không thành công vì không phải tất cả chuỗi byte đều là chuỗi hợp lệ trong một mã hóa cụ thể

Không có cách nào dễ dàng để xác định loại mã hóa nào được sử dụng trong chuỗi byte

Việc chuyển đổi giữa unicode và byte được thực hiện thông qua chức năng encode[]str0. Chúng tôi cũng cố gắng thực hiện thao tác ngược lại và giải mã các đối tượng byte như sau

Không có cách nào dễ dàng để xác định loại mã hóa nào được sử dụng trong chuỗi byte

Vì vậy, chúng tôi cần cung cấp mã hóa chính xác [utf-8, utf-16, v.v. ] đến phương pháp giải mã

Các mẫu biểu thức chính quy

Hãy nhớ rằng các mẫu biểu thức chính quy cũng áp dụng cho các ký tự không phải là tiếng Latinh. Ở đây, làm cách nào để xóa các ký tự nằm ngoài phạm vi ký tự US-ASCII?

Đây là bài viết phải đọc đối với những người thường xuyên xử lý các tệp Unicode [áp dụng cho cả các bảng mã khác] trong công việc hàng ngày của họ. Xử lý các tệp Unicode với tư cách là một học viên xử lý ngôn ngữ tự nhiên là một cơn ác mộng, đặc biệt nếu bạn đang sử dụng hệ điều hành Windows. Hãy tưởng tượng sự thất vọng khi bạn gặp lỗi trong quá trình mã hóa hoặc giải mã chẳng hạn như

UnicodeEncodeError: 'mbcs' codec can't decode characters in positionUnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position

Hầu hết thời gian, những lỗi như vậy không đủ thông tin trừ khi bạn là người kỳ cựu trong lĩnh vực này. Bạn có thể hỏi tại sao chúng ta cần mã hóa và giải mã các ký tự. Hãy bắt đầu với một lời giải thích đơn giản về Unicode. Dựa trên tài liệu chính thức về python, Unicode [Bộ ký tự được mã hóa chung] là một đặc điểm kỹ thuật nhằm liệt kê mọi ký tự được sử dụng bởi ngôn ngữ của con người và cung cấp cho mỗi ký tự mã duy nhất của riêng nó. Các thông số kỹ thuật Unicode liên tục được sửa đổi và cập nhật để thêm các ngôn ngữ và ký hiệu mới

Do đó, mã hóa và giải mã phục vụ như một cách để ánh xạ các ký tự từ văn bản sang byte hoặc ngược lại. Điều này cho phép chúng tôi chuyển chúng giữa các máy tính và sử dụng chúng trong cuộc sống hàng ngày của chúng tôi. Nó trở nên phức tạp hơn khi bạn có các bộ hệ điều hành khác nhau. Ngoài ra, các ngôn ngữ khác nhau có bộ ký tự riêng chỉ có thể hiển thị dưới một số phông chữ nhất định. Để đơn giản, hãy coi nó giống như dịch một ký tự nước ngoài sang một ký tự mà máy móc hiểu được. Trong bài viết này, chúng ta sẽ khám phá một số phương pháp có thể được sử dụng để xử lý các tệp Unicode trong Python. Hãy bắt đầu với các chế độ có sẵn và mã hóa tiêu chuẩn

Đọc hoặc ghi tệp thông qua trình quản lý bối cảnh

Cách an toàn nhất để mở tệp là thông qua trình quản lý ngữ cảnh bằng cách sử dụng câu lệnh with. Nó sẽ tự động đóng tệp cho chúng tôi ngăn chặn mọi sự cố có thể phát sinh

Chế độ mặc định là 'rt' dùng để đọc và tệp văn bản. Bạn có thể viết bằng đoạn mã sau

Đoạn mã trên sẽ ghi đè và cắt bớt tệp. Trong một số trường hợp, bạn có thể thích sử dụng chế độ 'a' thay vì 'w'. Danh sách sau đây hiển thị các chế độ hoàn chỉnh có sẵn

  • r. mở để đọc [mặc định]
  • w. mở để viết, cắt bớt tệp trước
  • x. mở để tạo độc quyền, không thành công nếu tệp đã tồn tại
  • a. mở để viết, thêm vào cuối tệp nếu nó tồn tại
  • b. chế độ nhị phân
  • t. chế độ văn bản [mặc định]
  • +. mở tệp đĩa để cập nhật [đọc và ghi]

Bạn có thể kết hợp một số chế độ. , đối với quyền truy cập đọc-ghi nhị phân, chế độ 'w+b' mở và cắt bớt tệp thành 0 byte. 'r+b' mở tệp mà không cắt bớt

Mã hóa tiêu chuẩn trong Python

Để chỉ định mã hóa trong Python, bạn chỉ cần chuyển vào một đối số khác trong quá trình khởi tạo trình quản lý ngữ cảnh. Bạn phải chỉ định nó bất cứ khi nào bạn đang đọc hoặc viết các ký tự Unicode. Ví dụ sau đây cho thấy cách thích hợp để nối văn bản Unicode vào một tệp hiện có

Nếu bạn không chắc nên sử dụng mã hóa nào, chỉ cần nhập utf8 và kiểm tra lỗi. Hầu hết thời gian, UTF-8 đủ tốt để mã hóa và giải mã các ký tự. Tuy nhiên, có một số trường hợp bạn cần sử dụng bảng mã khác để thay thế. Kiểm tra những điều sau đây để tìm hiểu thêm về các mã hóa có sẵn. Nếu bạn không biết mã hóa nào được sử dụng trong tệp của mình thì sao?

Kiểm tra loại mã hóa qua Notepad++

Cá nhân, tôi thích sử dụng Notepad ++ hơn để xem nội dung tệp. Nếu bạn mở tệp bằng Notepad++, bạn có thể thấy loại mã hóa được sử dụng ở dưới cùng bên phải của giao diện người dùng

Một tệp ví dụ đã sử dụng mã hóa UTF-8. Hình ảnh của tác giả

Bạn có thể sửa đổi mã hóa thông qua menu Mã hóa. Nó chấp nhận một loạt các mã hóa được sử dụng phổ biến nhất

Hình ảnh hiển thị menu thả xuống khi nhấp vào menu mã hóa. Hình ảnh của tác giả

Nếu bạn đã từng gặp sự cố không thể chuyển đổi tệp sang mã hóa khác hoặc không đọc được một số mã hóa nhất định mặc dù bạn đã chỉ định chính xác, bạn có thể thử phương pháp ngu ngốc nhưng hiệu quả sau đây

  1. Tạo một tệp văn bản trống với các mã hóa mà bạn mong muốn
  2. Sao chép tất cả nội dung từ tệp gốc
  3. Dán nó vào tệp mới và lưu nó

Hầu hết thời gian, điều này sẽ tự động chuyển đổi tất cả các ký tự thành mã hóa mới. Xin lưu ý rằng có thể mất dữ liệu nếu không thể chuyển đổi ký tự dựa trên mã hóa mới

Xử lý các ký tự trong một mã hóa không xác định

Nếu bạn đã từng rơi vào trường hợp không xác định được mã hóa và các ký tự hóa ra là một thứ gì đó không xác định, bạn có thể thử sửa đổi đối số lỗi để giải quyết vấn đề

Đối số lỗi đề cập đến cách xử lý lỗi mã hóa và giải mã. Xin lưu ý rằng đối số này không thể được sử dụng ở chế độ nhị phân. Các trình xử lý lỗi có sẵn là

  • nghiêm khắc. để đưa ra một ngoại lệ ValueError nếu có lỗi mã hóa. Giá trị mặc định của None có tác dụng tương tự
  • Làm lơ. bỏ qua lỗi. Lưu ý rằng bỏ qua lỗi mã hóa có thể dẫn đến mất dữ liệu
  • thay thế. làm cho một điểm đánh dấu thay thế [chẳng hạn như
    file_path = 'C:\path\to\数据分析\data.csv'
    0] được chèn vào nơi có dữ liệu không đúng định dạng
  • người thay thế. sẽ biểu thị bất kỳ byte không chính xác nào dưới dạng các điểm mã trong Khu vực sử dụng riêng của Unicode, từ U+DC80 đến U+DCFF. Các điểm mã riêng tư này sau đó sẽ được chuyển trở lại thành các byte giống nhau khi trình xử lý lỗi này được sử dụng để ghi dữ liệu. Điều này hữu ích để xử lý các tệp ở dạng mã hóa không xác định
  • xmlcharreplace. chỉ được hỗ trợ khi ghi vào một tập tin. Các ký tự không được mã hóa hỗ trợ được thay thế bằng tham chiếu ký tự XML thích hợp
    file_path = 'C:\path\to\数据分析\data.csv'
    1
  • dấu gạch chéo ngược thay thế. thay thế dữ liệu không đúng định dạng bằng chuỗi thoát dấu gạch chéo ngược Python
  • tên thay thế. [cũng chỉ được hỗ trợ khi viết] thay thế các ký tự không được hỗ trợ bằng chuỗi ký tự thoát
    file_path = 'C:\path\to\数据分析\data.csv'
    2

Hiển thị các ký tự Unicode trong dấu nhắc lệnh

Nếu bạn đang chạy dấu nhắc lệnh trong hệ điều hành Windows, nó sẽ gặp sự cố hiển thị ký tự Unicode hầu hết thời gian. hóa ra các ký tự vô nghĩa giống như hình dưới đây

Dấu nhắc lệnh hiển thị các ký tự vô nghĩa. Hình ảnh của tác giả

Để giải quyết vấn đề này, chúng tôi cần thay đổi cài đặt thành phông chữ chính xác

  1. Nhấp chuột phải vào menu trên cùng và nhấp vào thuộc tính
  2. Nhấp vào menu phông chữ
  3. Sửa đổi phông chữ thành phông chữ mong muốn có thể hiển thị ký tự. Ví dụ: bạn có thể sử dụng phông chữ KaiTi để hiển thị các ký tự tiếng Trung

Thuộc tính phông chữ của dấu nhắc lệnh. Hình ảnh của tác giả

Mở đường dẫn tệp có ký tự Unicode — áp dụng cho read_csv qua mô-đun pandas

Phần này hơi phức tạp, đặc biệt khi bạn đang sử dụng một số mô-đun Python chẳng hạn như gấu trúc. Giả sử bạn có đường dẫn tệp sau bằng ngôn ngữ không phải tiếng Anh

file_path = 'C:\path\to\数据分析\data.csv'

Cố gắng đọc tệp qua read_csv sẽ gây ra lỗi đơn giản vì đường dẫn tệp chứa các ký tự Unicode. Đây không phải là vấn đề nếu bạn đang sử dụng hàm open[] tích hợp sẵn trong Python. Để giải quyết vấn đề này, trước tiên chúng ta cần mở tệp, sau đó chuyển tệp đó vào hàm read_csv

Phần kết luận

Hãy tóm tắt lại những gì chúng tôi đã đề cập trong hướng dẫn này. Đầu tiên, chúng tôi đã học được tầm quan trọng của việc sử dụng trình quản lý ngữ cảnh [có câu lệnh] khi đọc và ghi tệp. Chúng tôi đã tiếp xúc với danh sách các chế độ có sẵn và mã hóa tiêu chuẩn có thể được sử dụng trong Python. Bây giờ chúng ta đã biết sử dụng một trình soạn thảo văn bản hiện có như Notepad++ để cung cấp cho chúng ta cái nhìn thoáng qua về mã hóa và cấu trúc của tệp đầu vào. Nếu có bất kỳ ký tự nào có mã hóa không xác định, chúng tôi có thể xử lý ký tự đó thông qua đối số lỗi trong quá trình khởi tạo. Đối với người dùng Windows, có một tùy chọn sửa đổi phông chữ trong dấu nhắc lệnh để hiển thị đúng văn bản Unicode. Cuối cùng, chúng tôi đã học cách mở tệp trước khi sử dụng mô-đun pandas để đọc bất kỳ tập dữ liệu nào. cám ơn vì đã đọc và chúc một ngày tốt lành

Python xử lý Unicode như thế nào?

Kiểu chuỗi của Python sử dụng Tiêu chuẩn Unicode để biểu thị các ký tự , cho phép các chương trình Python hoạt động với tất cả các ký tự có thể khác nhau này.

Có thể UTF

UTF-8 mở rộng bộ ký tự ASCII để sử dụng các điểm mã 8 bit, cho phép tối đa 256 ký tự khác nhau. Điều này có nghĩa là UTF-8 có thể đại diện cho tất cả các ký tự ASCII có thể in được, cũng như các ký tự không in được .

Chủ Đề