- 场景:执行以下查询,查看 pycharm Sciview,可以看到乱码,因为查询结果有西欧语言(如:ÿum)
df_rows = pd.read_sql_query(sql, engine)
- 原因
(1)查看 DB 字符集,结果是:WE8ISO8859P1 (ISO8859)
select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'; |
(2)查看当前默认字符集为,结果为:ASCII
>>> import sys | |
>>> sys.getdefaultencoding() | |
'ascii' |
(3)原因很明显,ISO-8859-1 对应为西欧语言,范围大于 ASCII(参考:https://zh.wikipedia.org/wiki/ISO/IEC_8859-1),导致乱码
- 解决:可以在执行 DB 查询后为该列解码
df_rows['description'] = df_rows['description'].apply(lambda x: str(x).decode('ISO-8859-1')) |
- 由于 ISO-8859-1 向下兼容 ASCII, 使用 json 直接解析时也会异常,由于 ASCII 不足以解析 0xff 范围内字符,需编码
# 错误的 json 解析方式 | |
json.loads(df_rows.to_json(orient='records')) | |
# 正确的 json 解析方式 | |
json.loads(df_rows.to_json(orient='records'), encoding='ISO-8859-1') |