我有一个包含波斯语字符串的变量,我无法正确地将该字符串保存到数据库中。我正在使用flask for REST API,我从客户端获取字符串。这是我的代码:
@app.route('/getfile',methods=['POST'])
def get_file():
#check the validity of json format
if not request.json or not 'FileName' in request.json:
abort(400)
if not request.json or not 'FilePath' in request.json:
abort(400)
if not request.json or not 'Message' in request.json:
abort(400)
#retreive data from request
filename_=request.json['FileName']
filepath_=request.json['FilePath']
message_=request.json['Message']
try:
conn = mysql.connector.connect(host=DBhost,database=DBname,user=DBusername,password=DBpassword)
except:
return jsonify({'Result':'Error, Could not connect to database.'})
cursor_ = conn.cursor()
query_ = "INSERT INTO sms_excel_files VALUES(null,%s,%s,%s,0)"
data_ =(filename_,Dst_num_file,message_)
cursor_.execute(query_, data_)
last_row_id_=cursor_.lastrowid
conn.commit()
有问题的变量是message_
。我可以正确保存英文文本,但不能保存波斯文本。我还在代码的顶部添加了# -*- coding: utf-8 -*-
,但这并没有解决问题。但是如果我用波斯语字符串手动填充message_
,它就会正确保存到数据库中。此外,如果我只返回message_
的值,那就是正确的。
例如,当message_
包含字符串'سلام'时,这是插入数据库的内容:
سلام
感谢任何帮助。
答案 0 :(得分:1)
请注意,这是我第一次尝试阅读阿拉伯语/波斯语字符,因此以下信息可能不正确(在将我的测试输出与您在其中显示的波斯字符串进行比较时,我可能会犯错误题)。此外,到目前为止,我从未听说过烧瓶。
说完这个:
1587 1604 1575 1605
是代码点序列,表示您在Unicode中显示的波斯语字符串。现在,在HTML中,Unicode代码点(十进制)可以编码为&#xxxx;
形式的实体。因此,字符串سلام
是 HTML中中该字符串的允许表示形式之一。
鉴于此,不良行为可能有两个可能的原因:
1)request.json ['Message']已经包含/返回HTML(而不是自然文本)和(由于某种原因我不知道)包含/以HTML实体编码形式返回有问题的字符串。所以这是你应该检查的第一件事。
2)cursor_.execute(...)以某种方式将字符串编码为HTML,从而(由于某种原因,我不知道)将您的字符串编码为HTML实体编码形式。也许您告诉数据库驱动程序将message_
中的非ASCII字符编码为HTML实体?
为了进一步分析,您可以检查在request.json['Message']
包含/仅返回ASCII字符的测试用例中会发生什么。
如果ASCII字符也作为HTML实体写入数据库,则必须存在一个基本问题,导致所有字符无异常地被编码到HTML实体中。
否则,您最终没有告诉您的数据库,数据库驱动程序或文件系统驱动程序使用哪种编码。在这种情况下,通常会正确处理ASCII字符,而非ASCII字符会发生奇怪的事情。但是,在文件IO或数据库操作期间自动将非ASCII字符编码为HTML实体将是非常不寻常的。但如上所述,我不知道烧瓶......
请参阅MySQL手册,了解如何设置数据库,表,列和连接的字符编码,数据库驱动程序文档,以了解必须执行哪些其他操作才能正确处理此编码,以及解释器和其库的手册,以了解如何正确设置文件IO的编码(CGI通过STDIN / STDOUT工作)。
如果数据库字符编码和文件IO编码完全相同,那么您的生活将变得更加轻松。就个人而言,我总是使用UTF-8。
最后一点:由于我对瓶子一无所知,我不知道# -*- coding: utf-8 -*-
应该做什么。但很有可能这个只告诉解释器脚本本身是如何编码的,而不是用于输入/输出/数据库操作的编码。
答案 1 :(得分:0)
试试这段代码。它使用的是MySQLdb库,它几乎就像你正在使用的库(在使用之前使用pip安装它)。
我试图以各种可能的方式设置“utf-8”。
# -*- coding: utf-8 -*-
import MySQLdb
# Open database connection
try:
db = MySQLdb.connect(host="localhost",
user="root",
passwd="",
db="db_name"
#,unix_socket="/opt/lampp/var/mysql/mysql.sock"
)
db.set_character_set('utf8')
crsr = db.cursor(MySQLdb.cursors.DictCursor)
crsr.execute('SET NAMES utf8;')
crsr.execute('SET CHARACTER SET utf8;')
crsr.execute('SET character_set_connection=utf8;')
except MySQLdb.Error as e:
print e