3

SQL Server 2005 にあるデータを要求するときに、Python コードでエンコードの問題に直面しています。

PyMSSQL-2.0.0b1 をコンパイルできなかったため)私はこのコードを使用しており、いくつかの選択を行うことができますが、SQLCMDが私に出力しているものがわからないという問題に固執しています: (

(テーブルに含まれるヨーロッパ言語を使用する必要があったため、アクセントなどを含む他のエンコーディングに直面する必要がありました)

例えば ​​:

  • Ms SQLServer Management Studio からそれを読んだ (選択した) とき、国名は「Ceská republika」です (最初の a は鋭角であることに注意してください)
  • コマンド ライン (Windows 7 の Powershell) から SQLCMD を使用する場合、それでも問題ありません。"Cesk'a with acute'" が表示されます。
  • Python をレシピの os.popen トリックで使用する場合、つまり、この接続文字列を使用します。

    sqlcmd -U 管理者名 -P パスワード -S サーバー名 -d データベース名 /w 8192 -u

私はこの文字列を取得します: 'Cesk\xa0 republika'

\xa0 に注意してください。私はそれがどのエンコーディングであるかを知っており、この \xa0 から {a with acute} に渡す方法を知っています...

Python と Unicode からテストする場合、この '\xe1' が必要です

>>> unicode('Cesk\xa0 republika')

Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    unicode('Cesk\xa0 republika')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xa0 in position 4: ordinal not in range(128)

>>> unicode_a_with_acute = u'\N{LATIN SMALL LETTER A WITH ACUTE}'
>>> unicode_a_with_acute
u'\xe1'
>>> print unicode_a_with_acute
á
>>> print unicode_a_with_acute.encode('cp1252')
á
>>> unicode_a_with_acute.encode('cp1252')
'\xe1'
>>> print 'Cesk\xa0 republika'.decode('cp1252')
Cesk  republika
>>> print 'Cesk\xa0 republika'.decode('utf8')

Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    print 'Cesk\xa0 republika'.decode('utf8')
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
 UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 4: invalid start byte

それで、SQLCMDが私に何を与えているのですか?Python 用の理解可能な utf8 があることを確認するために、それおよび/または os.popen などを強制するにはどうすればよいですか?

(注意してください、私は SQLCMD の os.popen cmd で終了する -u の有無の両方を試しましたが、これは SQLCMD にユニコードで応答するように要求することを表しますが、効果はありません。また、「選択」でフィードしようとしました" utf8 でエンコードされた python 文字列はこれ以上成功しません:

 sqlstr = unicode('select * from table_pays where country_code="CZ"')
 cu = c.cursor
 lst = cu.execute(sqlstr)
 rows = cu.fetchall()
 for x in rows:
      print x

 ( 'CZ          ', 'Cesk\xa0 republika       ')

)

別のポイント:「sqlcmd.exe」について、私がグーグルで調べたものから、役立つ可能性のあるこれらのパラメーターもあります:

[ -f < codepage > | i: < codepage > [ < , o: < codepage > ] ]

しかし、私は正しいものを指定できませんでした。可能な値が何であるかわかりません.BTWを使用する(または使用しない):

[ -u unicode output]

私も助けてくれません...

4

2 に答える 2

0

デフォルトのコードページは 850 または 437 のようです。コードページを推測しようとしないでください。chcpコマンド プロンプトで、システムが何を使用するように設定されているかがわかります。

コマンド プロセッサのコードページをchcpまたはで設定しようmode con:としても、pips やファイルへのリダイレクトではなく、コンソールの出力コードページが設定されるため、役に立たない可能性があります。

パイプで Unicode (または utf-16) 出力を取得するには、次を使用しますcmd /u

>>> subprocess.check_output('''cmd /u /c "echo hello\xe1"''').decode('utf16')
'helloá\r\n'
>>> 

しかし、実際のデータベース アダプターをインストールするだけの方が確実に優れています。

于 2011-11-14T09:56:05.583 に答える
0

問題は、コンソールがデフォルトで ascii モードで動作し、出力が現在のコードページ設定を介して変換されることです。-o <file> -u を使用して、結果を別のファイルに書き込むか、次のことを試すことができます。

次に、結果ファイルには適切な ucs2 エンコーディングが含まれます。これは、Python が喜んで採用します。もう 1 つは、utf8 コンソール出力をセットアップすることです (未テスト):

# setup utf8 on windows console
cmode = 'mode con: codepage select=65001 > NUL & '
cmd = 'my command'
f = os.popen(cmode + cmd)
out = f.readlines()
于 2011-11-11T03:37:00.810 に答える