In các ký tự không phải ASCII Python
Giả sử bạn đã định cấu hình rô-bốt của mình để nói bằng tiếng Pháp và bạn muốn nó nói một số câu từ tệp dữ liệu Show Làm như vậy phức tạp hơn một chút so với âm thanh, bởi vì bạn phải quan tâm đến việc mã hóa Thí dụĐầu tiên các bạn tải các file sau về bỏ vào robot, trong cùng thư mục Tệp Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)7 chứa chuỗi “I like coffee”, tệp Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)8 và Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)9 giữ bản dịch tiếng Pháp của nó. J'aime le café, vì vậy tốt nhất là robot của bạn có thể nói tiếng Pháp ngoài tiếng Anh. ) Hãy xem xét kỹ hơn về tập tin #! /usr/bin/env python # -*- encoding: UTF-8 -*- """Example: Non ascii Characters""" import qi import argparse import sys import codecs def say_from_file(tts_service, filename, encoding): with codecs.open(filename, encoding=encoding) as fp: contents = fp.read() # warning: print contents won't work to_say = contents.encode("utf-8") tts_service.say(to_say) def main(session): """ This example uses non ascii characters. """ # Get the service ALTextToSpeech. tts_service = session.service("ALTextToSpeech") try : tts_service.setLanguage('French') except RuntimeError: print "No French pronunciation because French language is not installed. Pronunciation will be incorrect." say_from_file(tts_service, 'coffee_fr_utf-8.txt', 'utf-8') say_from_file(tts_service, 'coffee_fr_latin9.txt', 'latin9') tts_service.setLanguage('English') # the string "I like coffee" is encoded the exact same way in these three # encodings say_from_file(tts_service, 'coffee_en.txt', 'ascii') say_from_file(tts_service, 'coffee_en.txt', 'utf-8') say_from_file(tts_service, 'coffee_en.txt', 'latin9') if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--ip", type=str, default="127.0.0.1", help="Robot IP address. On robot or Local Naoqi: use '127.0.0.1'.") parser.add_argument("--port", type=int, default=9559, help="Naoqi port number") args = parser.parse_args() session = qi.Session() try: session.connect("tcp://" + args.ip + ":" + str(args.port)) except RuntimeError: print ("Can't connect to Naoqi at ip \"" + args.ip + "\" on port " + str(args.port) +".\n" "Please check your script arguments. Run with -h option for help.") sys.exit(1) main(session) Trước tiên, hãy lưu ý cách chúng tôi không sử dụng Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)0 mà sử dụng Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)1, chỉ định mã hóa Cũng lưu ý cách chúng tôi giải mã kết quả đọc từ tệp. Đối tượng được trả về bởi Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)2 là đối tượng Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)3 và chúng tôi cần mã hóa lại đối tượng đó để nhận đối tượng Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)0 được mã hóa trong i’UTF-8’, có thể sử dụng proxy TTS Cố gắng chạy Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)1 sẽ không hoạt động vì Python sẽ cố giải mã chuỗi bằng ngôn ngữ hiện tại của rô-bốt, đó là 'ASCII', dẫn đến lỗi này Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128) Cuối cùng, lưu ý rằng bất kể mã hóa tệp là gì, mọi thứ đều được mã hóa thành 'UTF-8' trước khi được gửi tới proxy chuyển văn bản thành giọng nói Tôi đã thử khá nhiều cách kết hợp có thể có của các thủ thuật trên, tất cả đều có cùng kết quả (ngoại trừ chuỗi được cung cấp dưới dạng byte hiển thị các ký tự đặc biệt có nhiều ký tự lạ hơn, chẳng hạn như có nhiều byte hơn được giải mã thành str) PEP này đề xuất một biểu mẫu biểu diễn chuỗi mới cho Python 3000. Trong Python trước Python 3000, hàm tích hợp repr() đã chuyển đổi các đối tượng tùy ý thành các chuỗi ASCII có thể in được để gỡ lỗi và ghi nhật ký. Đối với Python 3000, phạm vi ký tự rộng hơn, dựa trên tiêu chuẩn Unicode, nên được coi là 'có thể in được' repr() hiện tại chuyển đổi chuỗi 8 bit thành ASCII bằng thuật toán sau
Đối với chuỗi Unicode, các chuyển đổi bổ sung sau được thực hiện
Thuật toán này chuyển đổi bất kỳ chuỗi nào thành ASCII có thể in được và repr() được sử dụng như một cách thuận tiện và an toàn để in chuỗi để gỡ lỗi hoặc ghi nhật ký. Mặc dù tất cả các ký tự không phải ASCII đều được thoát, điều này không thành vấn đề khi hầu hết các ký tự của chuỗi là ASCII. Nhưng đối với các ngôn ngữ khác, chẳng hạn như tiếng Nhật, nơi hầu hết các ký tự trong chuỗi không phải là ASCII, điều này rất bất tiện Chúng tôi có thể sử dụng Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)4 để có được một chuỗi có thể đọc được, nhưng chúng tôi không có cách giải quyết tương tự để in các chuỗi từ các bộ sưu tập như danh sách hoặc bộ dữ liệu. Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)5 sử dụng repr() để xây dựng chuỗi sẽ được in, do đó, các chuỗi kết quả luôn được thoát hex. Hoặc khi Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)6 đưa ra một ngoại lệ, thông báo lỗi giống như Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)7, điều này không hữu ích Python 3000 có rất nhiều tính năng hay dành cho người dùng không phải người dùng Latinh, chẳng hạn như số nhận dạng không phải ASCII, vì vậy sẽ rất hữu ích nếu Python cũng có thể phát triển theo cách tương tự đối với đầu ra có thể in được Một số người dùng có thể lo ngại rằng đầu ra như vậy sẽ làm rối bảng điều khiển của họ nếu họ in dữ liệu nhị phân như hình ảnh. Nhưng điều này khó có thể xảy ra trong thực tế vì byte và chuỗi là các loại khác nhau trong Python 3000, vì vậy việc in một hình ảnh ra bảng điều khiển sẽ không làm rối tung nó lên Vấn đề này đã từng được thảo luận bởi Hye-Shik Chang, nhưng đã bị từ chối
repr() trong Python 3000 phải là Unicode, không dựa trên ASCII, giống như chuỗi Python 3000. Ngoài ra, việc chuyển đổi sẽ không bị ảnh hưởng bởi cài đặt ngôn ngữ, vì ngôn ngữ không nhất thiết phải giống với ngôn ngữ của thiết bị đầu ra. Ví dụ: quy trình trình nền thường được gọi trong cài đặt ASCII, nhưng ghi UTF-8 vào tệp nhật ký của nó. Ngoài ra, các ứng dụng web có thể muốn báo cáo thông tin lỗi ở dạng dễ đọc hơn dựa trên mã hóa của trang HTML Các ký tự không được bảng điều khiển của người dùng hỗ trợ có thể được thoát khỏi hệ thập lục phân khi in, bởi trình xử lý lỗi của bộ mã hóa Unicode. Nếu trình xử lý lỗi của tệp đầu ra là 'dấu gạch chéo ngược', thì các ký tự đó sẽ được thoát ở dạng thập lục phân mà không tăng UnicodeEncodeError. Ví dụ: nếu mã hóa mặc định là ASCII, thì Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)47 sẽ in ra ‘Xin chào \xa2’. Nếu mã hóa là ISO-8859-1, 'Xin chào ¢' sẽ được in Trình xử lý lỗi mặc định cho sys. thiết bị xuất chuẩn là 'nghiêm ngặt'. Các ứng dụng khác đọc đầu ra có thể không hiểu các ký tự thoát hex, vì vậy các ký tự không được hỗ trợ sẽ bị giữ lại khi viết. Nếu phải thoát các ký tự không được hỗ trợ, trình xử lý lỗi phải được thay đổi rõ ràng. không giống như sys. thiết bị xuất chuẩn, hệ thống. stderr không tăng UnicodeEncodingError theo mặc định, vì trình xử lý lỗi mặc định là 'dấu gạch chéo ngược'. Vì vậy, việc in các thông báo lỗi chứa các ký tự không phải ASCII thành sys. stderr sẽ không đưa ra một ngoại lệ. Ngoài ra, thông tin về các ngoại lệ chưa được phát hiện (đối tượng ngoại lệ, truy nguyên) được trình thông dịch in ra mà không đưa ra các ngoại lệ Để giúp gỡ lỗi bằng các ngôn ngữ không phải là tiếng Latinh mà không thay đổi repr(), các đề xuất khác đã được đưa ra
Thay đổi repr() có thể phá vỡ một số mã hiện có, đặc biệt là mã kiểm tra. Năm trong số các bài kiểm tra hồi quy của Python không thành công với sửa đổi này. Nếu bạn cần chuỗi repr() không có ký tự không phải ASCII như Python 2, bạn có thể sử dụng hàm sau Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)4 Để ghi nhật ký hoặc gỡ lỗi, đoạn mã sau có thể tăng UnicodeEncodeError log = open("logfile", "w") log.write(repr(data)) # UnicodeEncodeError will be raised # if data contains unsupported characters. Để tránh các trường hợp ngoại lệ được đưa ra, bạn có thể chỉ định rõ ràng trình xử lý lỗi Traceback (most recent call last): File "non_ascii.py", line 22, in main() File "non_ascii.py", line 18, in main say_from_file(filename) File "non_ascii", line 10, in say_from_file print contents UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 13: ordinal not in range(128)4 Ví dụ: đối với bảng điều khiển sử dụng mã hóa dựa trên Unicode, en_US. utf8 hoặc de_DE. utf8, thủ thuật thay thế dấu gạch chéo ngược không hoạt động và tất cả các ký tự có thể in được không thoát. Điều này sẽ gây ra vấn đề vẽ các ký tự giống nhau trong các ngôn ngữ phương Tây, Hy Lạp và Cyrillic. Các ngôn ngữ này sử dụng các bảng chữ cái tương tự (nhưng khác nhau) (có nguồn gốc từ một tổ tiên chung) và chứa các chữ cái trông giống nhau nhưng có các mã ký tự khác nhau. Ví dụ, thật khó để phân biệt 'a', 'e' và 'o' trong tiếng Latin với 'а', 'е' và 'о' trong tiếng Cyrillic. (Dĩ nhiên, cách thể hiện bằng hình ảnh phụ thuộc rất nhiều vào các phông chữ được sử dụng nhưng thông thường các chữ cái này hầu như không thể phân biệt được. ) Để tránh sự cố, người dùng có thể điều chỉnh mã hóa đầu cuối để có kết quả phù hợp với môi trường của họ
Tác giả đã viết một bản vá trong http. // lỗi. con trăn. tổ chức/vấn đề2630; . 0 nhánh trong bản sửa đổi 64138 ngày 06-11-2008 Ký tự không in được trong Python là gì?Các ký tự không in được là những ký tự không nhìn thấy được và không chiếm bất kỳ không gian in nào . Một số ký tự Unicode, chẳng hạn như “Khác” và “Dấu phân cách,” không in được. Các ký tự không in được bao gồm tất cả các ký tự thoát như '\n', \'t', '\r', '\x16', '\xlf', v.v.
Những ký tự nào không phải là ASCII?Tổng quan. Các ký tự không phải ASCII là những ký tự không được mã hóa bằng ASCII, chẳng hạn như Unicode, EBCDIC , v.v. ASCII được giới hạn ở 128 ký tự và ban đầu được phát triển cho ngôn ngữ tiếng Anh. Trong hướng dẫn này, chúng ta sẽ xem xét một số công cụ để tìm và đánh dấu các ký tự không phải ASCII trong tệp văn bản.
Các ký tự không in được trong ASCII là gì?Một số ký tự không in được phổ biến nhất là dấu xuống dòng, nạp biểu mẫu, nạp dòng, xóa lùi, thoát, tab ngang và tab dọc . Chúng có thể không có hình dạng rõ ràng nhưng sẽ có tác dụng đối với đầu ra. Để hiểu rõ hơn về chúng, chúng ta phải xem bảng ASCII. |