Как я санирую ввод данных пользователем для надлежащего довольного кодирования, прежде чем я сохраню его?

Вы можете использовать Series.mask:

# df['old'] = df['old'].mask(df['old'].str.len() == 0, df['new'])
df['old'].mask(df['old'].str.len() == 0, df['new'])

0     [51, 1]
1     [52, 1]
2    [53, -1]
3    [54, -2]
4     [54, 0]
5     [55, 0]
6     [52, 0]
7      [52.0]
8     [52, 0]
9    [54, -1]
Name: old, dtype: object
12
задан brian d foy 16 April 2009 в 16:39
поделиться

3 ответа

Этот входной текст часто содержит символы, неправильные для выходной кодировки, такие как «умные кавычки», которые приходят из документ в кодировке Windows-1252

«Интеллектуальные кавычки» (байты 147 и 148 в cp1252) являются совершенно допустимыми символами Unicode, U + 201C и U + 201D. Ваше приложение должно быть способно обрабатывать их без проблем; если нет, то вы делаете что-то не так, и, скорее всего, все символы, не входящие в ASCII, потерпят неудачу.

Независимо от того, были ли символы получены от того, кто их печатал или кто-то вставлял их из Word, браузер должен отправлять UTF-8- закодированные символы в ваше приложение, которое должно хранить те же байты UTF-8 в базе данных.

Если браузер не отправляет в UTF-8, скорее всего, вы не в состоянии установить кодировку страницы HTML, содержащей сформироваться. Это можно сделать с помощью HTTP-заголовка:

Content-Type: text/html;charset=utf-8

и / или элемента:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

в .

Могу ли я просто установить атрибут accept-charset в форме и сделать так, чтобы браузер сделал это для меня?

Нет, accept-charset в принципе бесполезен благодаря IE, который неправильно интерпретирует его как «попробуйте использовать этот набор символов, если тот, что на странице не может кодировать нужные нам символы», вместо «всегда использовать этот набор символов». Это означает, что если вы используете accept-charset, вы можете получить сразу несколько кодировок, без возможности выяснить, что есть что. Хорошо!

Почему моя база данных принимает эти символы, которые являются зарезервированными / управляющими символами в UTF-8?

В MySQL UTF-8 - это просто сопоставление, используемое для сравнения и упорядочения. Он по-прежнему хранит данные в байтах и ​​не заботится о том, не являются ли они действительными последовательностями UTF-8.

В любом случае, хорошая идея декодировать и проверять входящие последовательности UTF-8 в вашем приложении, потому что «короткие последовательности», недопустимые в современном Unicode, могут скрывать символ «<», который все еще будет распознаваться старыми браузерами (по крайней мере, IE6 до SP2 , Опера 7).

ETA:

Итак, я ввел строку, содержащую байт 146

Нет, вы ввели символ Unicode U + 201B. Браузер работает с символами Unicode, а не с байтами, вплоть до момента, когда он должен отправить сериализованную форму на сервер. Тогда он решает, как превратить символы в байты, и если страница обрабатывается как UTF-8, он всегда будет выбирать UTF-8.

(Если это не UTF-8, браузеры склонны обманывать в нестандартный способ: для всех символов, которые не вписываются в кодировку, он будет кодировать их в ссылки на символы HTML, такие как '& # 8217;'. Это неправильно, потому что теперь вы не можете отличить экранированную браузером '&' от реальной, & типизированной пользователем '&', и это коварно неверно, потому что если вы затем отобразите ссылку в виде неэкранированного HTML, это будет похоже на вас ' правильно понимаете, что на самом деле вы только что сделали большую старую дыру в безопасности.)

Он вошел в базу данных как 146

Действительно, байт '\ x92', а не '\ xC2 \ x92', '\ xE2 \ x80 \ x99' или '& # 146;'?

он появился, когда я создал XML (в кодировке UTF-8), как 146. Никаких жалоб из браузера

Тогда он не выходить как один 146 байт. Браузер будет жаловаться, когда в XML-файле будет указан пустой символ \ x92. (Это не HTML-файл, в котором недопустимые последовательности UTF-8 выглядят как глиф отсутствующего символа.)

Я подозреваю, что он появляется как '& # 146;' характеристика личности, который правильно сформирован (хотя символ U + 0092 является частью набора элементов управления C1, поэтому не будет отображаться как ничего полезного). Если это то, что происходит, ваша страница формы в конце концов не воспринимается как UTF-8, и вы столкнулись с проблемой браузера-авто-экранирования-отправки, описанной выше.

9
ответ дан 2 December 2019 в 21:45
поделиться

Вы можете попробовать модуль Perl Encode . Он поддерживает преобразование между несколькими наборами символов, включая UTF-8 couse. Я только что проверил мою установку Perl, и она также поддерживала "cp1252", который является еще одним названием для Windows-1252 согласно Википедии. Вы можете проверить свою собственную установку со следующим одним вкладышем:

perl -MEncode -e 'print map {"$_\n"} Encode->encodings(":all");'
2
ответ дан 2 December 2019 в 21:45
поделиться

«Могу ли я просто установить атрибут accept-charset в форме и сделать так, чтобы браузер сделал это для меня? »

Только если вы готовы доверять« браузеру »- это может подойти в некоторых приложениях, но в целом это оставляет вас широко открытыми для шалости (или того хуже).

(Также см. предупреждения Бобинса о IE ...)

Iain

1
ответ дан 2 December 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: