[英]encoding problems writing UTF-8 SQL statements to a local file
我用這種方式將SQL寫入服務器上的文件:
import codecs
f = codecs.open('translate.sql',mode='a',encoding='utf8',errors='strict')
然后編寫如下的SQL語句:
query = (u"""INSERT INTO story_question_response
(group_id, story_id, question_id, answer )
VALUES
(%s,@last_story_id,%s,'%s');
""" % (kw.get('to'), lookup.get(q), kw.get(q)))
f.write(query)
我確認當我將其拉出時文本是可以的。 這是從字典(kw)傳遞到網頁的數據:
46:埼玉県
47:熊谷市
42:お散歩デモ
似乎正確(我希望將其轉為utf8)。 但是file.write輸出是垃圾(編碼問題):
INSERT INTO story_question_response
(group_id, story_id, question_id, answer )
VALUES
(279,@last_story_id,62,'ãã©ã³ãã£ã¢ããã'); )
/* updating the story text on old story_id */
UPDATE story_question_response
SET answer = '大å¦ã®ããã·ã§ã¯ãã¦å¦çãæ¬å¤§éç½ã®è¢«ç½å°(岩æçã®å¤§è¹æ¸¡å¸)ã«æ´¾é£ãããããã¦ã¯ç¾å°ã®å¤ç¥ãã®ãæ$
WHERE story_id = 65591
AND question_id = 41
AND group_id = 276;
使用顯式解碼會產生錯誤:
f.write(query.decode('utf8'))
我不知道還能嘗試什么。
問題:編寫utf8文件時我做錯了什么?
我們沒有足夠的信息來確保,但是我可以肯定地說您的文件實際上是完全有效的UTF-8,而您只是在查看它,就好像它是別的東西一樣。
例如,在Windows上,默認情況下,如果您在記事本中打開文件,則該文件僅在以UTF-8 BOM開頭時才將其視為UTF-8(從來沒有有效的文件,但Microsoft仍然喜歡它們); 否則,它將視為默認代碼頁。 這可能是一些拉丁文1衍生詞,例如CP1252。
因此,您的假名和漢字字符串最終編碼為一串三字節的UTF-8序列,例如'\\xe6\\xad\\xa9'
。 然后,在記事本中將其顯示為CP1252中每個字節恰好意味着的含義,例如æ©
(請注意,兩個可見字符之間有一個不可見字符)。
通常,每當您每2或3個字符看到小寫字母A和E的重音符號版本時,這幾乎總是意味着您已將某些CJK UTF-8解釋為某些源自Latin-1的字符集,因為UTF-8使用\\xE3
至\\xED
作為大多數CJK字符的前綴字節 ,並且Latin-1在該范圍內加了小寫的A和E字符 。 (同樣的,古怪的口音大寫的A版本通常意味着歐洲或象征性的UTF-8解釋為Latin-1的,尤其是當你有流浪Â
s前插入成什么樣子,否則有效或幾乎有效的歐洲文字。如果你看一下圖表中,您應該能夠知道原因。)
假設您輸入的是utf8,則可能應該使用以下代碼來生成查詢:
query = (u"""INSERT INTO story_question_response
(group_id, story_id, question_id, answer )
VALUES
(%s,@last_story_id,%s,'%s');
""" % (kw.get('to').decode('utf8'), lookup.get(q).decode('utf8'), kw.get(q).decode('utf8')))
我也建議嘗試輸出kw的內容並查找某些日志文件以調試此問題。
您應該在unicode類的對象上使用encoding,在python中對str類的對象使用解碼。
您應該轉義插入SQL語句的任何字符串,以防止討厭的SQL注入。
上面的代碼不包含此類轉義,因此請小心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.