首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将UTF-8 SQL语句写入本地文件的编码问题

将UTF-8 SQL语句写入本地文件的编码问题
EN

Stack Overflow用户
提问于 2013-12-12 21:22:42
回答 2查看 1.4K关注 0票数 0

我以这种方式将SQL写入服务器上的一个文件:

代码语言:javascript
复制
import codecs
f = codecs.open('translate.sql',mode='a',encoding='utf8',errors='strict')

然后编写如下SQL语句:

代码语言:javascript
复制
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)的数据:

代码语言:javascript
复制
46:埼玉県
47:熊谷市
42:お散歩デモ

它看起来是正确的(我希望它是utf8转义的)。但是file.write输出是垃圾(编码问题):

代码语言:javascript
复制
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;

使用显式解码会产生错误:

代码语言:javascript
复制
f.write(query.decode('utf8'))

我不知道还能尝试什么。

问:在编写utf8文件时,我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-12 21:38:23

我们没有足够的信息来确定,但我认为您的文件实际上是完全有效的UTF-8,而您只是把它看作是其他的东西。

例如,在Windows上,如果您在记事本中打开一个文件,默认情况下,它只会将其视为UTF-8,如果它以UTF-8 BOM开头(没有任何有效的文件,但微软无论如何都喜欢它们);否则,它将把它当作默认的代码页。这可能是一些类似于CP1252的拉丁文-1衍生词。

所以,您的kana和kanji字符串最终被编码成一串三字节的UTF-8序列,如'\xe6\xad\xa9'。然后,它将在记事本中显示为CP1252中的任何一个字节,比如æ­© (注意,两个可见字节之间有一个不可见的字符)。

通常情况下,每当你每2或3个字符看到一次奇怪的小写字母A和E的重音版本时,这几乎总是意味着您已经将一些CJK 8解释为一些拉丁文1派生的字符集,因为作为大多数CJK字符的前缀字节。拉丁文-1在该范围内增加了小写字母A和E。。(类似地,奇怪的是,带有口音的大写字母A通常指被解释为拉丁语的欧洲或象征性的UTF-8,尤其是当您在看似有效或几乎有效的欧洲文本中插入了偏离的Âs时。如果你看一下图表,你就会知道原因。)

票数 0
EN

Stack Overflow用户

发布于 2013-12-12 21:50:19

假设您的输入是utf8,您可能应该使用以下代码来生成查询:

代码语言:javascript
复制
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的对象使用编码,在python中对str类的对象使用解码。

您应该转义插入SQL语句中的任何字符串,以防止严重的SQL注入。

上面的代码不包括这样的转义,所以要小心。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20554524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档