Проблема с кодировкой Python и json.dumps () - PullRequest
0 голосов
/ 02 ноября 2019

Я хочу хранить теги заголовков в MySQL, мне нужно хранить их на разных языках (например, английском, персидском, арабском и т. Д.). Например, моя строка должна выглядеть примерно так:

{"h1": "زبان فارس - english"}

Но когдаЯ хочу сохранить в моей базе данных юникод, изменяющийся на что-то вроде ниже:

{"h1": "\u0628\u0631\u062e\u0648\u0631\u062f"}

Мой код Python 3:

    data = {}
    if not soup.find('h1'):
        h1 = ""
    else:
        heading_flag = 1
        h1 = (soup.find('h1').text).strip()
        " \n \t".join(h1.split())
        data['h1']="{}".format(h1)
    if not soup.find('h2'):
        h2 = ""
    else:
        h2 = (soup.find('h2').text).strip()
        " \n \t".join(h2.split())
        data['h2']="{}".format(h2)

    if not soup.find('h3'):
        h3 = ""
    else:
        heading_flag = 1
        h3 = (soup.find('h3').text).strip()
        " \n \t".join(h3.split())
        data['h3']="{}".format(h3)

    if not soup.find('h4'):
        h4 = ""
    else:
        heading_flag = 1
        h4 = (soup.find('h4').text).strip()
        " \n \t".join(h4.split())
        data['h4']="{}".format(h4)

    if not soup.find('h5'):
        h5 = ""
    else:
        heading_flag = 1
        h5 = (soup.find('h5').text).strip()
        " \n \t".join(h5.split())
        data['h5']="{}".format(h5)

    if not soup.find('h6'):
        h6 = ""
    else:
        heading_flag = 1
        h6 = (soup.find('h6').text).strip()
        " \n \t".join(h6.split())
        data['h6']="{}".format(h6)

    if heading_flag ==1:
        page_heading = json.dumps(data)
    else:
        page_heading = ""

    page_content(initUrl[0], page_title, page_desc, page_heading)

Моя проблема связана с переменной данных, потому что, когда яПередача soup.find ('h6'). text как переменная page_heading, которую я могу сохранить с правильной кодировкой, а string - это что-то вроде (زبان فارس - english) в mysql db, а не как (\ u0628 \ u0631 \ u062e \ u0648 \ u0631 \ u062f)). Я пытался кодировать ('utf8'), но это было бесполезно. Я благодарен вам за любую помощь.

Обновление: моя функция для сохранения в db:

def page_content(link_id, page_title, page_desc, page_heading):
    insQuery="INSERT IGNORE INTO ex_ctnt(cw_id, c_title, c_meta_desc, c_heading) VALUES(%s, %s, %s, %s)"
    if ((len(page_title)>0)):
        connection = pymysql.connect(host="localhost", user="root", passwd="kiuhddh87d83gfgfg", db="hiihh8y929g2")
        myquery = connection.cursor()
        myquery.execute(insQuery,(link_id, page_title, page_desc, page_heading))
        connection.commit()
        connection.close()
    else:
        print("problem with the length of page title or description (Not Inserted !)")

1 Ответ

0 голосов
/ 02 ноября 2019

Все символы не ascii экранируются в JSON-строках.

Поэтому используйте флаг ensure_ascii=False при выводе json (по умолчанию True)

data = {"h1": "زبان فارس"}
without_ascii_escape = json.dumps(data, ensure_ascii=False)
print(without_ascii_escape)
## Returns {"h1": "زبان فارس"}, should be the same in db as well (at least after reading from there)

Из Python3.8 docstring

Если гарантировано, что true_ascii имеет значение true (по умолчанию), на выходе гарантированно экранируются все входящие символы, не входящие в ASCII. Если sure_ascii имеет значение false, эти символы будут выводиться как есть.

...