簡體   English   中英

將UTF-8 SQL語句寫入本地文件的編碼問題

[英]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.

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