我以这种方式将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文件时,我做错了什么?
发布于 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时。如果你看一下图表,你就会知道原因。)
发布于 2013-12-12 21:50:19
假设您的输入是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的对象使用编码,在python中对str类的对象使用解码。
您应该转义插入SQL语句中的任何字符串,以防止严重的SQL注入。
上面的代码不包括这样的转义,所以要小心。
https://stackoverflow.com/questions/20554524
复制相似问题