6

モジュールを使用OptParseして文字列値を取得しています。OptParse型指定された文字列のみをサポートし、str文字列はサポートしませんunicode

それでは、スクリプトを次のように開始するとしましょう。

./someScript --some-option ééééé

'é' などのフランス語の文字を入力すると、コードで読み取られたときに がstrトリガーされます。UnicodeDecodeError

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 99: ordinal not in range(128)

Unicode 組み込み関数を少しいじってみましたが、エラーが発生するか、文字が消えます。

>>> 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''

/文字列OptParseを取得するために使用できることはありますか?unicodeutf-8

更新

文字列を取得して印刷することはできるようですが、その文字列を (APSW モジュールを使用して) sqlite で使用しようとすると、何らかの方法で Unicode に変換しようとするとcursor.execute("...")、エラーが発生します。

エラーの原因となるサンプル プログラムを次に示します。

#!/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)
4

4 に答える 4

4

パーサーが引数を処理する前に引数をデコードできます。あなたの例を取る:

#!/usr/bin/python
# coding: utf-8
import os, sys, optparse
parser = optparse.OptionParser()
parser.add_option("--some-option")

# Decode the command line arguments to unicode
for i, a in enumerate(sys.argv):
    sys.argv[i] = a.decode('ISO-8859-15')

(opts, args) = parser.parse_args()
print type(opts.some_option), opts.some_option

これにより、次の出力が得られます。

C:\workspace>python file.py --some-option préférer
<type 'unicode'> préférer

私はISO/IEC 8859-15コード ページを選択しました。これが最も適切だと思われるためです。必要に応じて適応します。

于 2012-10-29T13:16:56.783 に答える
1

入力はコンソールのエンコードで返されるため、更新された例に基づいて、次を使用します。

print opts.some_option.decode(sys.stdin.encoding)

unicode(opts.some_option)デフォルトでasciiは、エンコーディングとして使用されます。

于 2012-10-30T12:12:51.867 に答える
0

あなたのエラーはのものに関連していると思います:

たとえば、ユーロ通貨記号を含む Unicode リテラルを記述するには、ISO-8859-15 エンコーディングを使用して、ユーロ記号の序数値 164 を使用できます。このスクリプトは、値 8364 (ユーロ記号に対応する Unicode コードポイント) を出力します。 )そして終了します:

# -*- coding: iso-8859-15 -*-

currency = u"€"
print ord(currency)
于 2012-10-29T12:56:21.873 に答える