HTML-данные опубликованных форм записываются в виде базы данных в базу данных MySQL - PullRequest
0 голосов

Когда я пытаюсь ввести данные в текстовое поле греческими буквами, мой скрипт wsgi сохраняет эти данные в виде базы данных в базе данных MySQL, и я не знаю почему. Вот относительный код, когда данные собираются опубликовать с помощью метода формы:

pdata = pdata + '''
<form methods="POST" enctype="multipart/form-data" action="%s">
    <tr>
            <td> <center>   <input type="text"  name="task"     size=50>    </td>
            <td> <center>   <input type="text"  name="price"    size=5>     </td>
            <td> <center>   <input type="text"  name="lastvisit">           </td>
        </table><br><br>
        <td>    <input type="image" src="/static/img/submit.gif" name="update" value="Ενημέρωση!">  </td>
    </tr>
</form>
''' % app.get_url( '/update/<name>', name=name )


pdata = pdata + "<meta http-equiv='REFRESH' content='200;%s'>" % app.get_url( '/' )
return pdata

А вот относительная функция обратного вызова, которая пытается ввести данные размещенной формы в базу данных MySQL.

@app.route( '/update/<name>' )

def update( name ):

pdata = ''

task = request.query.get('task')
price = request.query.get('price')
lastvisit = request.query.get('lastvisit')


# check if date entered as intented, format it properly for MySQL
lastvisit = datetime.strptime(lastvisit, '%d %m %Y').strftime('%Y-%m-%d')


if( ( task and len(task) <= 200 ) and ( price and price.isdigit() and len(price) <= 3 ) and lastvisit != "error" ):
    # find the requested client based on its name
    cur.execute('''SELECT ID FROM clients WHERE name = %s''', name )
    clientID = cur.fetchone()[0]

    try:
        # found the client, save primary key and use it to issue hits & money UPDATE
        cur.execute('''UPDATE clients SET hits = hits + 1, money = money + %s WHERE ID = %s''', ( int(price), clientID ))

        # update client profile by adding a new record
        cur.execute('''INSERT INTO jobs (clientID, task, price, lastvisit) VALUES (%s, %s, %s, %s)''', ( clientID, task, price, lastvisit ))
    except:
        cur.rollback()

Я не могу понять, почему данные хранятся в базе данных как ненастоящие слова вместо надлежащего utf-8. Также попытка использовать тип кодировки utf-8 также не сработала.

<form methods="POST" enctype="utf-8" action="%s">

Ответы [ 2 ]

1 голос
/ 04 июня 2019

html-данные для публикации - «αυτή είναι μια δοκιμή», а конечный результат в базе данных - «Î ± ÏÏή είνΠ± ι μιΠ± δοκιμή"

Однако «αυτή είναι μια δοκιμή», по-видимому, является недействительным UTF-8, поскольку байт в позиции 38 (ή) указывает, что это двухбайтовый символ UTF-8, но следует только 1 байт ( ссылка ).

Если это точно данные, которые передаются в код;Затем вам нужно проверить и подтвердить, что форма HTML отправляет данные в правильном формате UTF-8.

<form accept-charset='UTF-8'>

Если ваша входная строка правильно закодирована в UTF-8, ваша выходная строка "string ± ÏÏή είνΠ± ι μιΠ± δοκιμή" равна UTF-7 или более вероятно ISO-8859-1 в кодировке ( ссылка ).

Поэтому проблема может заключаться в транспортном механизме (как определено выше; в представлении HTML-формы) или в кодировке хранилища базы данных.

Да Таблицы и столбцы MySQL настроены на utf8_general_ci.

Это также может быть проблемой.MySQL utf8_ является НЕ полным UTF-8 ( wat?! ), так как это 3 байта вместо 4 байтов;поэтому, если у вас есть 4-байтовый символ UTF-8, он сместит все последующие байты символов и сделает их похожими на мусор.

Решение:

Обновите вашСтолбцы MySQL и все сопоставления с utf8mb4_unicode_ci

Также убедитесь, что ваш транспортный механизм MySQL также использует utf8mb4_.

И, пожалуйста, Прочтите

1 голос
/ 04 июня 2019

В соответствии с документацией wsgi_mod кодировкой WSGIDaemonProcess по умолчанию является ASCII. Греческие символы не включены в ASCII, и ваш ввод не декодируется должным образом. Если вы хотите разрешить греческие символы, вы должны использовать либо UTF-8, либо iso-8859-1. Обычно серверы - это демоны, которые инициируются системой init, и 99% времени все еще использует ASCII в качестве кодировки по умолчанию. При разработке или отладке вы обычно не сталкиваетесь с этими проблемами, поскольку скрипты python наследуют среду текущего пользователя, которая обычно использует UTF-8.

$env
.....
LANG=en_GB.UTF-8
.....

Цитирование из wsgi_mod для apache:

LANG = локаль Установите текущую языковую локаль. Это то же самое, что установить переменную среды LANG. Вам нужно будет установить это во многих системах Linux, где Apache при запуске из сценариев инициализации системы использует язык C по умолчанию, то есть системная кодировка по умолчанию ASCII. Если вам не нужен специальный языковой стандарт, установите для него значение en_US.UTF-8. То, будет ли лучше работать опция lang или locale, зависит от используемой системы. Установите оба, если вы не уверены, что подходит.

локаль = локаль Установите текущую языковую локаль. Это то же самое, что установить переменную окружения LC_ALL. Вам нужно будет установить это во многих системах Linux, где Apache при запуске из сценариев инициализации системы использует язык C по умолчанию, то есть системная кодировка по умолчанию ASCII. Если вам не нужен специальный языковой стандарт, установите для него значение en_US.UTF-8. То, будет ли лучше работать опция lang или locale, зависит от используемой системы. Установите оба, если вы не уверены, что подходит.

...