/ / गलत एन्कोडेड वर्ण जब मैं utf8 को एन्कोडेड वर्णों को पांडा से लेक्स -1 एन्कोडिंग के साथ mysql में भेजता हूं - अजगर, mysql, पांडा, एन्कोडिंग

जब मैं utf8 एन्कोडेड वर्णों को पांडा से mysql में लैटिन -1 एन्कोडिंग के साथ भेजता हूं तो गलत एन्कोडेड वर्ण - पायथन, mysql, पांडा, एन्कोडिंग

मैं गलत इनकोडिंग अक्षर प्राप्त कर रहा हूं जब मैं लैटिन -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

समस्या यह है कि जब आप श्रृंखला को लागू करते हैं:

  1. "Utf-8" बाइट्स को यूनिकोड एनकोड करें।
  2. किसी भी 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() आपके कोड में चरण।