मैं गलत इनकोडिंग अक्षर प्राप्त कर रहा हूं जब मैं लैटिन -1 एन्कोडिंग के साथ पांडा से mysql को utf8 एन्कोडेड अक्षर भेजता हूं। यह एक नमूना मूल्य है जो मुझे 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)
उत्तर:
उत्तर № 1 के लिए 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
समस्या यह है कि जब आप श्रृंखला को लागू करते हैं:
- "Utf-8" बाइट्स को यूनिकोड एनकोड करें।
- किसी भी 1-बाइट एन्कोडिंग के साथ उन बाइट्स को डिकोड करें (जैसे "latin_1")।
हर गैर-ASCII यूनिकोड वर्ण के लिए इनपुट पर आप "करेंगे।" हमेशा गलत चरित्र प्राप्त होते हैं आउटपुट पर। ऐसा इसलिए होता है क्योंकि ऐसे चरित्र के लिए "utf-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")) # "xc3xad" => 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
तो, एन्कोडिंग के बाद प्रत्येक गैर- ASCII वर्ण के लिए आपके कोड में "utf-8"
आपको 2 बाइट्स मिलते हैं, जो बाद में डिकोड हो जाते हैं "latin_1"
2 वर्णों में, और वे प्रारंभिक चरित्र के अनुरूप नहीं हैं।
जिससे आपके कार्यक्रम की वर्तमान योजना अवांछनीय परिणाम उत्पन्न करेगी।
मैं उसी एन्कोडिंग का उपयोग करने का सुझाव देता हूं encode()
तथा decode()
आपके कोड में चरण।