当我使用latin-1编码将pdsas中的utf8编码字符发送到mysql时,我得到了错误的编码字符。 这是我在mysql中获得的示例值:
BiquÃni
这是我的代码:
df.breakdown_name = df.breakdown_name.str.encode('latin-1')
send_data(DB_ENGINE, MYSQL_USER, MYSQL_PASSWORD, MYSQL_HOST, MYSQL_PORT, MYSQL_DB, MYSQL_TABLE, df)
def send_data(db, db_user, db_password, db_host, db_port, db_name, db_table, df):
"""
Return data
1
"""
# print db
# print db_user
# print db_password
# print db_host
# print db_port
# print db_name
# print query[0:20]
SQL_ENGINE = '{db}://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}?charset={encoding}'.format(
db=db,
db_user=db_user,
db_password=db_password,
db_host=db_host,
db_port=db_port,
db_name=db_name,
encoding='latin1',
)
engine = create_engine(SQL_ENGINE)
df.to_sql(name=db_table,con=engine,schema='xxx',if_exists='append', index=False, chunksize=50)
答案 0 :(得分:1)
我假设样本值应为:
print u'BiquÃni'.encode('latin_1').decode('utf-8') # Biquíni
因此,在您的代码中,您正在进行逆转换:
print u'Biquíni'.encode('utf-8').decode('latin_1') # BiquÃni
问题是当你实现链时:
对于输入处的每个非ASCII unicode字符,您在输出处始终会收到错误字符。之所以发生这种情况,是因为对于这样一个角色,在&utff-8'中有至少2个字节的值。
让我们看看例子:
print ord(u'z') # 122 => ASCII
print repr(u'z'.encode('utf-8')) # 'z', 1 byte
print repr('z'.decode('latin_1')) # u'z'
正如我们所看到的,对于ASCII字符,一切正常,但是:
print ord(u'í') # 237 => non-ASCII
import unicodedata
print repr(u'í') # u'\xed'
print unicodedata.name(u'\xed') # LATIN SMALL LETTER I WITH ACUTE
print repr(u'\xed'.encode('utf-8')) # '\xc3\xad' => 2 bytes
print repr('\xc3'.decode('latin_1')) # u'\xc3' - the 1st char
print repr('\xad'.decode('latin_1')) # u'\xad' - the 2nd char
print unicodedata.name(u'\xc3') # LATIN CAPITAL LETTER A WITH TILDE
print unicodedata.name(u'\xad') # SOFT HYPHEN
因此,在'utf-8'
中编码后的每个非ASCII字符的代码中,您得到2个字节,然后用'latin_1'
解码为2个字符,并且它们不对应于初始字符字符。
因此,您的程序的当前方案将产生不良结果
我建议您在代码中对encode()
和decode()
步骤使用相同的编码。