【发布时间】:2018-11-18 03:13:25
【问题描述】:
我正在开发一个使用 python2/Gtk3/Glade 的笔记应用程序。
注释存储在 MySQL 数据库中并显示在 TextView widget 中。
我可以加载/存储/显示纯文本。但是我希望能够将图像添加到笔记页面,并将它们存储在数据库中。所以数据必须被序列化,我在弄清楚如何编码/解码序列化的过程中遇到了一些麻烦进出数据库的数据。我收到 unicode 起始字节错误。如果正在处理文件,我可以以二进制模式打开文件,但我将作为字符串存储在数据库中。我已经使用bytes() 和string.encode()[参见下面的示例代码] 以及其他一些方法尝试将 编码/解码 为 UTF-8 和 ASCII,但没有任何效果。
我正在使用此函数将图像添加到 textview 缓冲区:
def _AddImagetoNode(self,oWidget):
filenm = None
seliter = self.GetTreeSelection(self.treeview)
filenm = self.FileOpenDiag("Select an Image To Insert.","Image","*.png,*.jpg,*.bmp")
if filenm == None:
return()
#filenm = "/home/drift/Pictures/a.png"
buf = self.dataview.get_buffer()
pixbuf = GdkPixbuf.Pixbuf.new_from_file(filenm)
#pixbuf.scale_simple(dest_width, dest_height, gtk.gdk.INTERP_BILINEAR)
buf.insert_pixbuf(buf.get_end_iter(), pixbuf)
self.dataview.set_buffer(buf)
self.dataview.show()
这是存储文本视图缓冲区的函数:
def SaveDataView(self):
global DataViewNode
global DataViewIsImage
if len(self.GetProjectName()) == 0:
return()
buf = self.dataview.get_buffer()
format = buf.register_serialize_tagset()
data2 = buf.serialize(buf, format, buf.get_start_iter(), buf.get_end_iter())
#convert bytes(data) to string
data = data2.decode(encoding='UTF-8') #<< i think my problem is here
print("save b4 decode >>>>>>:%s"%data2)
sql = "UPDATE " + self.GetProjectName() + " SET tDataPath=%s WHERE tNodeID=%s"
val = (data, DataViewNode)
self.cursor.execute(sql,val)
self.mariadb_connection.commit()
这是加载缓冲区的函数:
def UpdateDataView(self, nodeid):
global DataViewNode
#global DataViewIsFile
DataViewNode=nodeid
if self.GetProjectName() != None and DataViewNode != None:
self.dataview.set_sensitive(True)
else:
self.dataview.set_sensitive(False)
self.dataview.show()
return()
buf = self.dataview.get_buffer()
buf.set_text('')
enc = self.DbGetNodeData(nodeid)
#convert string(enc) to bytes
data = enc.encode(encoding='UTF-8')#<<< i think my problem is here
print("update after decode >>>>>>>>>: %s"%data)
########### load
format = buf.register_deserialize_tagset()
buf.deserialize(buf, format, buf.get_end_iter(),data)
#buf.set_text(enc)
self.dataview.set_buffer(buf)
self.dataview.show()
我正在使用 mysql.connector 连接到 mariadb。 这是sql连接字符串:
self.mariadb_connection = mariadb.connect(user='box', password='box', host='localhost', database='Boxer',charset='utf8')
这是我遇到的错误。
Traceback(最近一次调用最后一次):文件“Boxer.py”,第 402 行,在 _TreeSelectionChanged self.SaveDataView() 文件“Boxer.py”,第 334 行,在 SaveDataView data = data2.decode(encoding='UTF-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 174: invalid start byte Traceback(最近一次调用最后一次):文件“Boxer.py”,第 398 行,在 _DataViewLostFocus self.SaveDataView() 文件“Boxer.py”,第 334 行,在 SaveDataView data = data2.decode(encoding='UTF-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 174: invalid start byte
使用此代码,我可以在文本视图中添加/编辑纯文本并成功保存/加载它,但只要我添加图像,我就会得到编码错误。任何帮助将不胜感激。
【问题讨论】:
-
这对我有用:
c.execute("UPDATE products SET description = %s WHERE id = 1", (psycopg2.Binary(data),))。但那是使用 PostgreSQL 和 Psycopg2。您没有指定用于连接 MySQL 的软件。 -
感谢您的回复。我正在使用 mysql.connector 连接到 mariadb(我使用 linux,但这没关系)
标签: python sql character-encoding gtk glade