2010-10-25 26 views
22

Trong mã hóa nào là các phần tử của sys.argv, bằng Python? chúng có được mã hóa bằng mã hóa sys.getdefaultencoding() không?Python: Mã hóa nào được sử dụng để xử lý sys.argv?

sys.getdefaultencoding(): Trả về tên mã hóa chuỗi mặc định hiện tại được sử dụng bởi thực thi Unicode.

PS: Như đã chỉ ra ở một số các câu trả lời, sys.stdin.encoding sẽ thực sự là một tốt hơn đoán. Tôi rất thích nhìn thấy một câu trả lời dứt khoát cho câu hỏi này, mặc dù, với con trỏ đến các nguồn vững chắc!

PPS: Như Wim đã chỉ ra, Python 3 giải quyết vấn đề này bằng cách đặt str đối tượng trong sys.argv (nếu tôi hiểu chính xác). Câu hỏi vẫn còn mở cho Python 2.x, mặc dù. Dưới Unix, biến môi trường LC_CTYPE có vẻ là điều đúng để kiểm tra, không? Điều gì nên được thực hiện với Windows (để các phần tử sys.argv được giải thích một cách chính xác bất kỳ giao diện điều khiển nào)?

Trả lời

3

"Điều gì nên được thực hiện với Windows (để các phần tử sys.argv được giải thích chính xác bất kỳ giao diện điều khiển nào)?"

Đối với Python 2.x, xem this comment on issue2128.

(Lưu ý rằng không có mã vạch là chính xác cho sys.argv ban đầu, vì một số ký tự có thể bị xáo trộn theo cách không có đủ thông tin để hoàn tác, ví dụ, nếu mã ANSI không thể đại diện cho alpha Hy Lạp nó sẽ bị xáo trộn thành 'a'.)

+0

Được đánh dấu là đã được chấp nhận: nhận xét mới này về vấn đề 2128 là thông tin mới! Cảm ơn bạn! – EOL

4

Trên hệ thống Unix, nó phải nằm trong miền địa phương của người dùng, đó là (kỳ lạ) không được gắn với sys.getdefaultencoding. Xem http://docs.python.org/library/locale.html.

Trong Windows, nó sẽ nằm trong hệ thống mã ANSI.

(Bằng cách này, những giáo viên tiểu học đã nói với bạn không kết thúc một câu với một giới từ được nói dối bạn.)

+0

Đề xuất lúng túng là điều gì đó mà tôi sẽ không đưa ra. Sự khắt khe được cho là chống lại khuynh hướng lúng túng dường như đã phát triển từ một quan sát về phong cách. Để wit, những lời đầu tiên và cuối cùng của một câu là những người có tác động tự nhiên nhất. Vì vậy, nó được coi là yếu về mặt phong cách cho một vị trí chỉ được đặt ở một vị trí chiến lược quan trọng như vậy. –

+0

@Jim: Phong cách là tất cả tốt và tốt, nhưng một số người dường như có khái niệm ngớ ngẩn này rằng nó không đúng ngữ pháp, dẫn đến goofiness như là tiêu đề của câu hỏi này. –

+0

Tiêu đề của câu hỏi này dường như đủ rõ ràng mặc dù tôi có thể đã đề xuất sử dụng * * thay vì "cái gì". Phrasing chính xác hơn có thể là: "Mã hóa nào được sử dụng để xử lý sys.argv?" Toàn bộ vấn đề mã hóa văn bản đã trở nên khá phức tạp bởi tất cả những nỗ lực này để chứa cả hai bộ ký tự quốc tế trong khi vẫn giữ một số xử lý chuỗi ASCII đơn giản. Thuật ngữ xung quanh toàn bộ vấn đề đã trở nên phức tạp tương tự. –

5

Tôi không biết nếu điều này giúp hay không nhưng đây là những gì tôi nhận được trong chế độ DOS:

C:\Python27>python Lib\codingtest.py нер 
['Lib\\codingtest.py', '\xed\xe5\xf0'] 

C:\Python27>python Lib\codingtest.py hello 
['Lib\\codingtest.py', 'hello'] 

trong IDLE:

>>> print "hello" 
hello 
>>> "hello" 
'hello' 
>>> "привет" 
'\xef\xf0\xe8\xe2\xe5\xf2' 
>>> print "привет" 
привет 
>>> sys.getdefaultencoding() 
'ascii' 
>>> 

Những gì chúng ta có thể suy ra từ này? Tôi chưa biết ... Tôi sẽ bình luận một chút.

Một chút sau: sys.argv được mã hóa với sys.stdin.encoding và không sys.getdefaultencoding()

+0

\ xef là biểu tượng Cyrillic UNICODE CP1251 của SMALL LETTER PE ('п'), do đó tôi bắt đầu tin rằng 'sys.argv' được mã hóa với' sys.stin.encoding' chứ không phải 'sys.getdefaultencoding() ' – soulseekah

4

Một vài quan sát:

(1) Đó chắc chắn không sys.getdefaultencoding.

(2) sys.stdin.encoding dường như là đặt cược tốt hơn nhiều.

(3) Trên Windows, giá trị thực tế của sys.stdin.encoding sẽ thay đổi, tùy thuộc vào phần mềm nào đang cung cấp stdio. IDLE sẽ sử dụng trang mã "ANSI" của hệ thống, ví dụ: cp1252 ở hầu hết Tây Âu và Mỹ và các thuộc địa cũ của chúng. Tuy nhiên trong cửa sổ Dấu nhắc lệnh, mô phỏng MS-DOS nhiều hơn hoặc ít hơn, trang mã DOS cũ tương ứng (ví dụ: cp850) sẽ được sử dụng theo mặc định. Điều này có thể được thay đổi bằng cách sử dụng lệnh CHCP (thay đổi mã trang).

(4) Tài liệu dành cho mô-đun phụ không cung cấp bất kỳ đề xuất nào về cách mã hóa để sử dụng cho args và stdout.

(5) Một tín thác mà assert sys.stdin.encoding == sys.stdout.encoding không bao giờ thất bại.

+0

Các quan sát có vẻ đúng, tôi cũng đã quan sát như vậy. Bạn có bất kỳ ý tưởng về chính xác những gì sys.getdefaultencoding trả về? –

+0

"Nó trả về tên của mã hóa chuỗi mặc định hiện tại được sử dụng bởi việc thực hiện Unicode." Tôi nghĩ rằng nó có nghĩa là Python sử dụng defaultencoding() trong giao diện điều khiển của nó. Bạn có thể ghi đè lên defaultencoding() bằng cách thêm "u'' bằng cách này. Câu trả lời hay nhất +1 – soulseekah

+4

Tôi đồng ý về (2) - Tôi đã nghĩ về nó sau. (5) thực sự không đúng: theo Unix, ví dụ 'python test.py> test.txt' có UTF-8 cho mã hóa stdin và None cho mã hóa stdout. – EOL

7

Tôi đoán rằng bạn đang yêu cầu điều này bởi vì bạn đã gặp phải issue 2128. Lưu ý rằng điều này đã được sửa trong Python 3.0.

+0

Cảm ơn bạn, tôi sẽ kiểm tra liên kết. Tôi thực sự đặt câu hỏi một cách phòng ngừa, trước khi viết một chương trình nhận tin nhắn của người dùng từ dòng lệnh. – EOL

+0

Điều gì về Python 2.x? và Windows? – EOL

0

sys.getfilesystemencoding() hoạt động đối với tôi, ít nhất là trên Windows. Trên Windows, nó thực sự là 'mbcs' và 'utf-8' trên * nix.

Các vấn đề liên quan