Tôi đang sử dụng mô-đun OptParse
để truy lục giá trị chuỗi. OptParse
only supports str
typed strings, không phải unicode
.Làm cách nào để có thể truy xuất các chuỗi có ký tự không phải ASCII bằng OptParse?
Vì vậy, chúng ta hãy nói rằng tôi bắt đầu kịch bản của tôi với:
./someScript --some-option ééééé
nhân vật Pháp, chẳng hạn như 'é', được đánh máy str
, kích hoạt UnicodeDecodeError
s khi đọc trong các mã:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 99: ordinal not in range(128)
tôi chơi xung quanh một chút với chức năng tích hợp unicode, nhưng tôi hoặc bị lỗi hoặc nhân vật biến mất:
>>> unicode('é');
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
>>> unicode('é', errors='ignore');
u''
Tôi có thể làm gì để sử dụng OptParse
để truy xuất unicode
/utf-8
chuỗi không?
CẬP NHẬT:
Dường như chuỗi có thể được lấy ra và in ok, nhưng sau đó tôi cố gắng sử dụng chuỗi với sqlite (sử dụng các mô-đun APSW), và nó cố gắng để chuyển đổi sang unicode bằng cách nào đó với cursor.execute("...")
, và sau đó lỗi xảy ra.
Dưới đây là một chương trình mẫu mà gây ra lỗi:
#!/usr/bin/python
# coding: utf-8
import os, sys, optparse
parser = optparse.OptionParser()
parser.add_option("--some-option")
(opts, args) = parser.parse_args()
print unicode(opts.some_option)
Đối tượng Str chỉ là các cửa hàng byte vì vậy nếu đầu vào là UTF-8, chuỗi sẽ giữ giá trị UTF-8. Lỗi unicode được ném ở đâu? –
Tôi vừa thử nghiệm điều này trên một giao diện điều khiển UTF-8 và optparse hoạt động tốt và trả về ký tự cho bàn điều khiển. Bạn có thể làm rõ nếu lỗi này là trong mã của bạn hoặc trong các optparse? –
Tùy thuộc vào chương trình của bạn trên optparse hoặc bạn đang xây dựng từ đầu? Trong trường hợp đó tôi sẽ giới thiệu gói docopts thay vì optparse. Bạn sẽ thực sự thực sự ngạc nhiên vì nó dễ dàng phân tích cú pháp các đối số cli như thế nào. – Bruce