簡體   English   中英

使用非ascii字符時的SQL Server(SQLCMD),Python和編碼問題

[英]SQL Server (SQLCMD), Python and encoding issue when using non ascii chars

在詢問SQL Server 2005中的數據時,我遇到了python代碼的編碼問題。

(因為我無法編譯PyMSSQL-2.0.0b1 )我正在使用這段代碼 ,我能夠做一些選擇但現在我堅持我不知道SQLCMD輸出給我的問題: (

(我必須使用表中包含的歐洲語言,所以我不得不面對其他帶有重音的編碼等等)

例如 :

  • 當我從Ms SQLServer Management Studio中讀取它(選擇)時,我有這個國家名稱:'Ceskárepublika'(注意第一個a是急性的)
  • 當從SQLCMD從命令行(Windows 7中的Powershell)使用它時,它仍然可以,我可以看到“Cesk'a with acute'”
  • 現在當使用Python與配方中的os.popen技巧時,就是使用這個連接字符串:

    sqlcmd -U adminname -P password -S servername -d dbname / 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給了我什么? 我應該如何強制它和/或os.popen和其他人確保我對Python有可理解的utf8?

(請注意,我已嘗試使用和不使用-u結尾的os.popen cmd for SQLCMD,這應該代表要求SQLCMD以unicode回答,沒有任何效果,我也嘗試用“select”來提供它“在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       ')

另一點:從我的googl-ed,關於“sqlcmd.exe”,還有這些參數可能會有所幫助:

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

但是我無法指定正確的值,我不知道可能的值是什么,BTW使用(或不使用):

[ -u unicode output]

別幫我也...

問題可能是控制台默認以ascii模式工作,輸出通過當前代碼頁設置轉換。 您可以嘗試以下操作,將結果寫入單獨的文件:-o <file> -u

然后結果文件將具有正確的ucs2編碼,python樂意采取。 另一種是設置utf8控制台輸出(未經測試):

# setup utf8 on windows console
cmode = 'mode con: codepage select=65001 > NUL & '
cmd = 'my command'
f = os.popen(cmode + cmd)
out = f.readlines()

看起來您的默認代碼頁是850或437.永遠不要試圖猜測代碼頁:命令提示符中的chcp將告訴您系統設置使用的內容。

嘗試使用chcpmode con:設置命令處理器代碼頁不太可能有用,因為它們設置控制台的輸出代碼頁而不是pips或重定向到文件。

要在管道中獲取unicode(或更確切地說,utf-16)輸出,請使用cmd /u

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

但是,安裝真正的數據庫適配器幾乎肯定會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM