我正在尝试显示firebird 3.x数据库的结果,但是得到:
文件 “ /...../Envs/pos/lib/python3.6/site-packages/fdb/fbcore.py”, b2u中的479行 返回st.decode(charset)UnicodeDecodeError:'utf-8'编解码器无法解码位置9的字节0xd1:无效的连续字节
尽管我到处都设置了utf-8:
# -- coding: UTF-8 --
import os
os.environ["PYTHONIOENCODING"] = "utf8"
from sqlalchemy import *
SERVIDOR = "localhost"
BASEDATOS_1 = "db.fdb"
PARAMS = dict(
user="SYSDBA",
pwd="masterkey",
host="localhost",
port=3050,
path=BASEDATOS_1,
charset='utf-8'
)
firebird = create_engine("firebird+fdb://%(user)s:%(pwd)s@%(host)s:%(port)d/%(path)s?charset=%(charset)s" % PARAMS, encoding=PARAMS['charset'])
def select(eng, sql):
with eng.connect() as con:
return eng.execute(sql)
for row in select(firebird, "SELECT * from clientes"):
print(row)
答案 0 :(得分:1)
我会尝试使用模块unidecode
。
您的脚本在尝试转换时崩溃,因此该模块可以为您提供帮助。正如他们在模块文档中所说的:
模块导出一个采用Unicode对象的函数 (Python 2.x)或字符串(Python 3.x)并返回一个字符串(可以是 在Python 3.x中编码为ASCII字节)
首先使用pip下载它,然后尝试以下操作:
import unidecode
...
if type(line) is unicode:
line = unidecode.unidecode(line)
我希望它能解决您的问题。
答案 1 :(得分:1)
我遇到了同样的问题。
在我的情况下,数据库不在UTF-8中。
在连接字符串中设置了正确的字符集后,它起作用了:java.util.concurrent.ThreadLocalRandom