[英]SQL Server (SQLCMD), Python and encoding issue when using non ascii chars
在詢問SQL Server 2005中的數據時,我遇到了python代碼的編碼問題。
(因為我無法編譯PyMSSQL-2.0.0b1 )我正在使用這段代碼 ,我能夠做一些選擇但現在我堅持我不知道SQLCMD輸出給我的問題: (
(我必須使用表中包含的歐洲語言,所以我不得不面對其他帶有重音的編碼等等)
例如 :
現在當使用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
將告訴您系統設置使用的內容。
嘗試使用chcp
或mode 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.