Làm cách nào để sử dụng mô-đun Unicode trong Python?

Điều thường xảy ra là bạn có dữ liệu văn bản ở dạng Unicode, nhưng bạn cần thể hiện nó ở dạng ASCII. Ví dụ: khi tích hợp với mã kế thừa không hỗ trợ Unicode hoặc để dễ nhập tên không phải là tiếng La Mã trên bàn phím Hoa Kỳ hoặc khi xây dựng mã định danh máy ASCII từ chuỗi Unicode mà con người có thể đọc được vẫn có thể hiểu được phần nào. Một ví dụ phổ biến về điều này là khi tạo một URL slug từ một tiêu đề bài viết

Unidecode không phải là sự thay thế cho việc hỗ trợ đầy đủ Unicode cho các chuỗi trong chương trình của bạn. Có một số cảnh báo đi kèm với việc sử dụng nó, đặc biệt là khi đầu ra của nó hiển thị trực tiếp với người dùng. Vui lòng đọc phần còn lại của README này trước khi sử dụng Unidecode trong dự án của bạn

Trong hầu hết các ví dụ được liệt kê ở trên, bạn có thể biểu thị các ký tự Unicode dưới dạng ??? . Nhưng điều đó gần như vô dụng đối với những người thực sự muốn đọc những gì văn bản nói

Những gì Unidecode cung cấp là một con đường trung gian. hàm unidecode[] lấy dữ liệu Unicode và cố gắng biểu diễn nó bằng các ký tự ASCII [i. e. , các ký tự có thể hiển thị phổ biến trong khoảng từ 0x00 đến 0x7F], trong đó các thỏa hiệp được thực hiện khi ánh xạ giữa hai bộ ký tự được chọn gần với giá trị mà một người dùng bàn phím Hoa Kỳ sẽ chọn

Chất lượng của biểu diễn ASCII kết quả khác nhau. Đối với các ngôn ngữ có nguồn gốc phương Tây, nó phải ở giữa hoàn hảo và tốt. Mặt khác phiên âm [i. e. , truyền đạt, bằng chữ cái La Mã, cách phát âm được thể hiện bởi văn bản trong một số hệ thống chữ viết khác] của các ngôn ngữ như tiếng Trung, tiếng Nhật hoặc tiếng Hàn là một vấn đề rất phức tạp và thư viện này thậm chí không cố gắng giải quyết vấn đề đó. Nó vẽ đường ở ánh xạ từng ký tự không có ngữ cảnh. Vì vậy, một nguyên tắc nhỏ là chữ viết bạn đang chuyển ngữ càng xa từ bảng chữ cái Latinh, thì việc chuyển ngữ sẽ càng tệ.

Nói chung, Unidecode tạo ra kết quả tốt hơn so với việc chỉ tước dấu khỏi các ký tự [có thể thực hiện bằng Python với các hàm tích hợp]. Nó dựa trên các ánh xạ ký tự được điều chỉnh bằng tay, chẳng hạn như cũng chứa các xấp xỉ ASCII cho các ký hiệu và bảng chữ cái không phải là tiếng Latinh

Lưu ý rằng một số người có thể thấy chuyển ngữ nhất định xúc phạm. Các ví dụ phổ biến nhất bao gồm các ký tự được sử dụng trong nhiều ngôn ngữ. Người dùng mong muốn một ký tự được chuyển ngữ bằng ngôn ngữ của họ nhưng Unidecode sử dụng chuyển ngữ cho một ngôn ngữ khác. Tốt nhất là không sử dụng Unidecode cho các chuỗi hiển thị trực tiếp với người dùng ứng dụng của bạn. Xem thêm phần Câu hỏi thường gặp để biết thêm thông tin về các sự cố thường gặp

This is a Python port of Text::Unidecode Perl module by Sean M. Burke .

nội dung mô-đun

Thư viện này chứa một hàm lấy một đối tượng chuỗi, có thể chứa các ký tự không phải ASCII và trả về một chuỗi có thể được mã hóa an toàn thành ASCII

>>> from unidecode import unidecode
>>> unidecode['kožušček']
'kozuscek'
>>> unidecode['30 \U0001d5c4\U0001d5c6/\U0001d5c1']
'30 km/h'
>>> unidecode['\u5317\u4EB0']
'Bei Jing '

Bạn cũng có thể chỉ định một đối số lỗi cho unidecode[] để xác định những gì Unidecode thực hiện với các ký tự không có trong bảng chuyển ngữ của nó. Mặc định là 'ignore' nghĩa là Unidecode sẽ bỏ qua các ký tự đó [thay thế chúng bằng một chuỗi rỗng]. 'nghiêm ngặt' sẽ tăng UnidecodeError. Đối tượng ngoại lệ sẽ chứa thuộc tính chỉ mục có thể được sử dụng để tìm ký tự vi phạm. 'replace' sẽ thay thế chúng bằng '?' . 'preserve' sẽ giữ ký tự gốc, không phải ASCII trong chuỗi. Lưu ý rằng nếu 'preserve' được sử dụng, chuỗi được trả về bởi unidecode[] sẽ không thể mã hóa ASCII

>>> unidecode['\ue000'] # unidecode does not have replacements for Private Use Area characters
''
>>> unidecode['\ue000', errors='strict']
Traceback [most recent call last]:
...
unidecode.UnidecodeError: no replacement found for character '\ue000' in position 0

Một tiện ích cũng được bao gồm cho phép bạn chuyển ngữ văn bản từ dòng lệnh theo nhiều cách. Đọc từ đầu vào tiêu chuẩn

$ echo hello | unidecode
hello

từ một đối số dòng lệnh

$ unidecode -c hello
hello

hoặc từ một tập tin

$ unidecode hello.txt
hello

Mã hóa mặc định được tiện ích sử dụng tùy thuộc vào ngôn ngữ hệ thống của bạn. Bạn có thể chỉ định mã hóa khác với đối số -e. Xem unidecode --help để biết danh sách đầy đủ các tùy chọn khả dụng

Yêu cầu

Không có gì ngoại trừ chính Python. Unicode hỗ trợ Python 3. 5 hoặc muộn hơn

Bạn cần một bản dựng Python với các ký tự Unicode “rộng” [còn được gọi là “bản dựng UCS-4”] để Unidecode hoạt động chính xác với các ký tự bên ngoài Mặt phẳng đa ngôn ngữ cơ bản [BMP]. Các ký tự phổ biến bên ngoài BMP là chữ đậm, chữ nghiêng, chữ viết, v.v. các biến thể của bảng chữ cái Latinh dành cho ký hiệu toán học. Mã hóa cặp thay thế của các bản dựng "hẹp" không được hỗ trợ trong Unidecode

Nếu bản dựng Python của bạn hỗ trợ Unicode “rộng”, biểu thức sau sẽ trả về True

>>> import sys
>>> sys.maxunicode > 0xffff
True

Xem PEP 261 để biết chi tiết về hỗ trợ cho các ký tự Unicode “rộng” trong Python

Cài đặt

Để cài đặt phiên bản Unidecode mới nhất từ ​​chỉ mục gói Python, hãy sử dụng các lệnh sau

$ pip install unidecode

Để cài đặt Unidecode từ nguồn phân phối và chạy thử nghiệm đơn vị, hãy sử dụng

$ python setup.py install
$ python setup.py test

Các câu hỏi thường gặp

âm sắc tiếng Đức được phiên âm không chính xác

Các chữ cái Latinh “a”, “o” và “u” với diaeresis được Unidecode phiên âm thành “a”, “o”, “u”, không theo quy tắc tiếng Đức “ae”, “oe”, “ue”. Đây là cố ý và sẽ không thay đổi. Cơ sở lý luận là những chữ cái này được sử dụng trong các ngôn ngữ khác ngoài tiếng Đức [ví dụ: tiếng Phần Lan và tiếng Thổ Nhĩ Kỳ]. Văn bản tiếng Đức được phiên âm mà không có thêm chữ “e” dễ đọc hơn nhiều so với các ngôn ngữ khác được phiên âm bằng quy tắc tiếng Đức. Một giải pháp thay thế là tự thay thế các ký tự này trước khi chuyển chuỗi tới unidecode[]

Kanji tiếng Nhật được phiên âm là tiếng Trung Quốc

Giống như với các chữ cái Latinh có dấu được thảo luận trong câu trả lời ở trên, tiêu chuẩn Unicode mã hóa các chữ cái, không phải các chữ cái trong một ngôn ngữ nhất định hoặc ý nghĩa của chúng. Với tiếng Nhật và tiếng Trung, điều này càng rõ ràng hơn vì cùng một chữ cái có thể có những phiên âm rất khác nhau tùy thuộc vào ngôn ngữ mà nó được sử dụng. Vì Unidecode không chuyển ngữ theo ngôn ngữ cụ thể [xem câu hỏi tiếp theo], nó phải quyết định một. Đối với một số ký tự được sử dụng bằng cả tiếng Nhật và tiếng Trung, quyết định là sử dụng phiên âm tiếng Trung. Nếu bạn định phiên âm văn bản tiếng Nhật, tiếng Trung hoặc tiếng Hàn, vui lòng cân nhắc sử dụng các thư viện khác chuyển ngữ theo ngôn ngữ cụ thể, chẳng hạn như Unihandecode

Unidecode nên hỗ trợ bản địa hóa [e. g. tham số ngôn ngữ hoặc quốc gia, kiểm tra ngôn ngữ hệ thống, v.v. ]

Chuyển ngữ theo ngôn ngữ cụ thể là một vấn đề phức tạp và nằm ngoài phạm vi của thư viện này. Những thay đổi liên quan đến điều này sẽ không được chấp nhận. Vui lòng cân nhắc sử dụng các thư viện khác cung cấp khả năng này, chẳng hạn như Unihandecode

Unidecode sẽ tự động phát hiện ngôn ngữ của văn bản được chuyển ngữ

Phát hiện ngôn ngữ là một vấn đề hoàn toàn riêng biệt và nằm ngoài phạm vi của thư viện này

Unidecode nên sử dụng giấy phép dễ dãi như MIT hoặc giấy phép BSD

Người duy trì Unidecode tin rằng việc cung cấp quyền truy cập vào mã nguồn khi phân phối lại là một yêu cầu công bằng và hợp lý khi sản phẩm dựa trên công việc tự nguyện của nhiều người đóng góp. Nếu giấy phép không phù hợp với bạn, vui lòng cân nhắc sử dụng các thư viện khác, chẳng hạn như text-unidecode

Unidecode tạo ra kết quả hoàn toàn sai [e. g. “u” với diaeresis phiên âm là “A 1/4”]

Các chuỗi bạn chuyển đến Unidecode đã bị giải mã sai ở đâu đó trong chương trình của bạn. Ví dụ: bạn có thể giải mã các chuỗi được mã hóa utf-8 thành latin1. Với thiết bị đầu cuối, ngôn ngữ và/hoặc trình soạn thảo văn bản bị định cấu hình sai, điều này có thể không rõ ràng ngay lập tức. Kiểm tra chuỗi của bạn bằng repr[] và tham khảo Unicode HOWTO

Tại sao Unidecode không thay thế dấu gạch chéo ngược \u và \U trong chuỗi của tôi?

Unidecode không biết gì về trình tự thoát. Phiên dịch các chuỗi này và thay thế chúng bằng các ký tự Unicode thực trong chuỗi ký tự là nhiệm vụ của trình thông dịch Python. Nếu bạn đang hỏi câu hỏi này, rất có thể bạn đang hiểu sai mục đích của thư viện này. Tham khảo Unicode HOWTO và có thể cả mã hóa unicode_escape trong thư viện chuẩn

Tôi đã nâng cấp Unidecode và bây giờ một số URL trên trang web của tôi trả về lỗi 404 Không tìm thấy

Đây là sự cố với phần mềm đang chạy trang web của bạn, không phải Unidecode. Thỉnh thoảng, các phiên bản mới của thư viện Unidecode được phát hành có chứa các cải tiến đối với bảng chuyển ngữ. Điều này có nghĩa là bạn không thể tin rằng đầu ra unidecode[] sẽ không thay đổi trên các phiên bản khác nhau của thư viện Unidecode. Nếu bạn sử dụng unidecode[] để tạo URL cho trang web của mình, hãy tạo sên URL một lần và lưu trữ nó trong cơ sở dữ liệu hoặc khóa sự phụ thuộc của Unidecode vào một phiên bản cụ thể

Một số vấn đề trong phần này được thảo luận chi tiết hơn trong bài đăng trên blog này

ghi chú hiệu suất

Theo mặc định, unidecode[] tối ưu hóa cho trường hợp sử dụng trong đó hầu hết các chuỗi được truyền cho nó đã chỉ ở dạng ASCII và không cần phiên âm [mặc định này có thể thay đổi trong các phiên bản sau]

Đối với các ứng dụng quan trọng về hiệu suất, hai chức năng bổ sung được đưa ra

unidecode_expect_ascii[] được tối ưu hóa cho các đầu vào chỉ có ASCII [nhanh hơn khoảng 5 lần so với unidecode_expect_nonascii[] trên các chuỗi 10 ký tự, nhiều hơn trên các chuỗi dài hơn], nhưng chậm hơn một chút đối với các đầu vào không phải ASCII

unidecode_expect_nonascii[] mất khoảng thời gian tương đương với các đầu vào ASCII và không phải ASCII, nhưng nhanh hơn một chút đối với các đầu vào không phải ASCII so với unidecode_expect_ascii[]

Ngoài sự khác biệt về thời gian chạy, cả hai chức năng đều tạo ra kết quả giống hệt nhau. Đối với hầu hết người dùng Unidecode, sự khác biệt về hiệu suất sẽ không đáng kể

Nguồn

Bạn có thể nhận phiên bản phát triển mới nhất của Unidecode với

________số 8_______

Ngoài ra còn có một bản sao chính thức của kho lưu trữ này trên GitHub tại https. //github. com/avian2/unidecode

Tiếp xúc

Vui lòng đảm bảo đọc phần trên trước khi liên hệ với người bảo trì

Báo cáo lỗi, bản vá và đề xuất cho Unidecode có thể được gửi tới tomaz. solc@tablix. tổ chức

Ngoài ra, bạn cũng có thể mở một vé hoặc yêu cầu kéo tại https. //github. com/avian2/unidecode

bản quyền

Bảng phiên âm ký tự gốc

Copyright 2001, Sean M. Burke , all rights reserved.

Mã Python và các phần bổ sung sau này

Copyright 2022, Tomaž Šolc

Chương trình này là phần mềm miễn phí;

Chương trình này được phân phối với hy vọng rằng nó sẽ hữu ích, nhưng KHÔNG CÓ BẤT KỲ BẢO HÀNH NÀO; . Xem Giấy phép Công cộng GNU để biết thêm chi tiết

Bạn đã nhận được một bản sao Giấy phép Công cộng GNU cùng với chương trình này; . , 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Các chương trình và tài liệu trong khu vực này được phân phối với hy vọng rằng chúng sẽ hữu ích, nhưng không có bất kỳ bảo đảm nào;

Cách sử dụng UTF

UTF-8 sử dụng các quy tắc sau. .
Nếu điểm mã < 128, thì nó được biểu thị bằng giá trị byte tương ứng
Nếu điểm mã >= 128, thì nó được chuyển thành một chuỗi gồm hai, ba hoặc bốn byte, trong đó mỗi byte của chuỗi nằm trong khoảng từ 128 đến 255

Python có hỗ trợ Unicode không?

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. Hướng dẫn này khác biệt vì nó không phải là ngôn ngữ bất khả tri mà thay vào đó là lấy Python làm trung tâm một cách có chủ ý

__ Unicode __ trong Python là gì?

__str__[] là phương thức cũ -- nó trả về byte. __unicode__[] là phương thức mới, được ưa thích -- phương thức này trả về các ký tự .

Làm cách nào để chuyển đổi chuỗi thành Unicode trong python3?

Phương pháp #2. Sử dụng phép nối[] + định dạng[] + ord[] .

Chủ Đề