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

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

  • Chuyển đổi CR, LF, TAB và ‘\’ thành ‘\r’, ‘\n’, ‘\t’, ‘\\’
  • Chuyển đổi các ký tự không in được khác [0x00-0x1f, 0x7f] và các ký tự không phải ASCII [>= 0x80] thành '\xXX'
  • Ký tự trích dẫn thoát dấu gạch chéo ngược [dấu nháy đơn, ‘] và thêm ký tự trích dẫn ở đầu và cuối

Đối với chuỗi Unicode, các chuyển đổi bổ sung sau được thực hiện

  • Chuyển đổi cặp ký tự thay thế hàng đầu không có ký tự ở cuối [0xd800-0xdbff, nhưng không có 0xdc00-0xdfff theo sau] thành ‘\uXXXX’
  • Chuyển đổi ký tự 16-bit [>= 0x100] thành ‘\uXXXX’
  • Chuyển đổi các ký tự 21-bit [>= 0x10000] và thay thế cặp ký tự thành ‘\U00xxxxxx’

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

  • Thêm chức năng mới vào Python C API
    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. Hàm này trả về 0 nếu repr[] thoát khỏi ký tự Unicode
    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; . Các ký tự cần thoát được xác định trong cơ sở dữ liệu ký tự Unicode là
    • Cc [Khác, Kiểm soát]
    • Cf [Khác, Định dạng]
    • Cs [Khác, Thay thế]
    • Co [Khác, Sử dụng Cá nhân]
    • Cn [Khác, Không Chỉ Định]
    • Zl [Dấu phân cách, Dòng], đề cập đến DÒNG DÒNG [’\u2028’]
    • Zp [Dấu phân cách, Đoạn văn], đề cập đến DẤU PHÂN ĐOẠN [’\u2029’]
    • Zs [Dấu phân cách, Dấu cách] khác với dấu cách ASCII [’\x20’]. Các ký tự trong danh mục này nên được thoát để tránh sự mơ hồ
  • Thuật toán xây dựng chuỗi repr[] nên được thay đổi thành
    • Chuyển đổi CR, LF, TAB và ‘\’ thành ‘\r’, ‘\n’, ‘\t’, ‘\\’
    • Chuyển đổi các ký tự ASCII không in được [0x00-0x1f, 0x7f] thành ‘\xXX’
    • Chuyển đổi cặp ký tự thay thế hàng đầu không có ký tự ở cuối [0xd800-0xdbff, nhưng không có 0xdc00-0xdfff theo sau] thành ‘\uXXXX’
    • Chuyển đổi các ký tự không in được [Py_UNICODE_ISPRINTABLE[] trả về 0] thành ‘\xXX’, ‘\uXXXX’ hoặc ‘\U00xxxxxx’
    • Ký tự trích dẫn thoát dấu gạch chéo ngược [dấu nháy đơn, 0x27] và thêm ký tự trích dẫn ở đầu và cuối
  • Đặt trình xử lý lỗi Unicode cho sys. stderr thành 'dấu gạch chéo ngược' theo mặc định
  • Thêm chức năng mới vào Python C API
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    0. Hàm này chuyển đổi bất kỳ đối tượng python nào thành một chuỗi bằng PyObject_Repr[] và sau đó thoát hex tất cả các ký tự không phải ASCII.
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    0 tạo chuỗi giống như
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    1 trong Python 2
  • Thêm chức năng tích hợp mới,
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    2. Hàm này chuyển đổi bất kỳ đối tượng python nào thành một chuỗi bằng repr[] và sau đó thoát hex tất cả các ký tự không phải ASCII.
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    2 tạo chuỗi giống như
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    4 trong Python 2
  • Thêm toán tử định dạng chuỗi
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    5.
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    5 chuyển đổi bất kỳ đối tượng python nào thành chuỗi bằng cách sử dụng repr[] và sau đó thoát hex tất cả các ký tự không phải ASCII. Toán tử định dạng
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    5 tạo chuỗi giống như
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    8 trong Python 2. Ngoài ra, hãy thêm cờ chuyển đổi
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    9 vào phương thức
    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]
    
    40 và thêm toán tử
    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]
    
    41 vào PyUnicode_FromFormat[]. Họ chuyển đổi bất kỳ đối tượng nào thành chuỗi ASCII dưới dạng toán tử định dạng chuỗi
    log = open["logfile", "w"]
    log.write[repr[data]]     # UnicodeEncodeError will be raised
                              # if data contains unsupported characters.
    
    5
  • Thêm phương thức
    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]
    
    43 vào kiểu chuỗ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]
    
    44 trả về Sai nếu repr[] thoát khỏi bất kỳ ký tự nào trong chuỗi; . Phương thức
    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]
    
    43 gọi hàm
    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]
    
    46 bên trong

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

  • Cung cấp một công cụ để in danh sách hoặc ký tự

    Các chuỗi được in để gỡ lỗi không chỉ được chứa trong danh sách hoặc ký tự mà còn trong nhiều loại đối tượng khác. Đối tượng tệp chứa tên tệp bằng Unicode, đối tượng ngoại lệ chứa thông báo bằng Unicode, v.v. Các chuỗi này phải được in ở dạng có thể đọc được khi repr[]ed. Không thể triển khai một công cụ để in tất cả các loại đối tượng có thể

  • sử dụng sys. móc trưng bày và hệ thống. trừ móc

    Đối với các phiên tương tác, chúng ta có thể viết các hook để khôi phục các ký tự thoát hex thành các ký tự gốc. Nhưng những hook này chỉ được gọi khi in kết quả đánh giá một biểu thức được nhập trong phiên Python tương tác và không hoạt động đối với hàm

    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]
    
    48, đối với phiên không tương tác hoặc đối vớ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]
    
    49, v.v.

  • phân lớp sys. thiết bị xuất chuẩn và sys. tiêu chuẩn

    Rất khó để triển khai một lớp con để khôi phục các ký tự thoát hex vì không có đủ thông tin còn lại vào thời điểm đó là một chuỗi để hoàn tác thoát một cách chính xác trong mọi trường hợp. Ví dụ:

    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]
    
    40 nên được in dưới dạng '\u0041', không phải 'A'. Nhưng không có cơ hội để phân biệt các đối tượng tệp

  • Đặt mã hóa được sử dụng bởi unicode_repr[] có thể điều chỉnh và đặt repr[] hiện tại làm mặc định

    Với repr[] có thể điều chỉnh, kết quả của việc sử dụng repr[] là không thể đoán trước và sẽ khiến bạn không thể viết mã chính xác liên quan đến repr[]. Và nếu repr[] hiện tại là mặc định, thì quy ước cũ vẫn còn nguyên và người dùng có thể mong đợi các chuỗi ASCII là kết quả của repr[]. Các ứng dụng hoặc thư viện của bên thứ ba có thể bị nhầm lẫn khi sử dụng hàm repr[] tùy chỉnh

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ọ

  • Thêm đối số mã hóa và lỗi vào hàm print[] dựng sẵn, với giá trị mặc định là sys. getfilesystemencoding[] và ‘backslashreplace’

    Phức tạp để thực hiện và nói chung, đây không được coi là một ý tưởng hay.

  • Sử dụng tên ký tự để thoát ký tự, thay vì mã ký tự hex. Ví dụ,
    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]
    
    41 có thể được chuyển đổi thà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]
    
    42

    Sử dụng tên ký tự có thể rất dài dòng so với thoát hex. e. g. ,

    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]
    
    43 được chuyển đổi thà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]
    
    44

  • Trình xử lý lỗi mặc định của sys. thiết bị xuất chuẩn phải là 'dấu gạch chéo ngược'

    Nội dung được ghi vào thiết bị xuất chuẩn có thể được sử dụng bởi một chương trình khác có thể hiểu sai \ thoát. Đối với các phiên tương tác, có thể đặt trình xử lý lỗi 'dấu gạch chéo ngược' làm trình xử lý lỗi mặc định, nhưng điều này có thể gây nhầm lẫn kiểu "nó hoạt động ở chế độ tương tác nhưng không hoạt động khi chuyển hướng đến một tệp"

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.

Chủ Đề