Проверить UTF-8 строку на UTF-8 в PHP
От: Geri Россия http://web-notes.ru/
Дата: 14.03.09 12:19
Оценка:
Получаю из открытой (небезопасной) среды строки в кодировке UTF-8, которые в последствии сохраняю в базу данных MySQL. Но изредка мне попадаются строки, содержащие по всей видимости не совсем UTF-символы, и MySQL отказывается сохранять такие сроки в поля с коллэйшином utf8_general_ci, выдавая ошибку с кодом 1366: "Incorrect string value: '\xEF\xB1' for column 'name' at row 1". Можно было бы, конечно, сделать коллэйшин utf8_bin, но тогда это поле стало бы регистро-зависимым, а не хотелось бы.

Я хотел бы производить какую-то проверку строки на содержание в ней действительно UTF-8 символов, чтобы не UTF-8 символы заменить хотя бы на символы "?", чтобы MySQL не выдавал ошибку и это не приводило к потере и других данных. Вот только в стандартном окружении PHP я что-то не могу найти подходящих функций. Как вариант, можно разбивать строку на отдельные символы через mb_strlen() и mb_substr(), а потом делать какое-нибудь бессмысленное преобразование через iconv() типа из UTF-8 в UTF-16 и обратно. Если символ обратно сконвертировалось в тот же самый -- значит все окей, иначе -- заменяем на "?". Но я не знаю как корректно будут вести себя эти функции с некорректными строками. Есть ли какой-то более простой и верный способ осуществить желаемое?
-- С уважением, Павел Мелехов, Екатеринбург.
Re: Проверить UTF-8 строку на UTF-8 в PHP
От: dkameleon Украина http://dkameleon.com
Дата: 15.03.09 05:43
Оценка:
Здравствуйте, Geri, Вы писали:

G>Получаю из открытой (небезопасной) среды строки в кодировке UTF-8, которые в последствии сохраняю в базу данных MySQL. Но изредка мне попадаются строки, содержащие по всей видимости не совсем UTF-символы, и MySQL отказывается сохранять такие сроки в поля с коллэйшином utf8_general_ci, выдавая ошибку с кодом 1366: "Incorrect string value: '\xEF\xB1' for column 'name' at row 1". Можно было бы, конечно, сделать коллэйшин utf8_bin, но тогда это поле стало бы регистро-зависимым, а не хотелось бы.


G>Я хотел бы производить какую-то проверку строки на содержание в ней действительно UTF-8 символов, чтобы не UTF-8 символы заменить хотя бы на символы "?", чтобы MySQL не выдавал ошибку и это не приводило к потере и других данных. Вот только в стандартном окружении PHP я что-то не могу найти подходящих функций. Как вариант, можно разбивать строку на отдельные символы через mb_strlen() и mb_substr(), а потом делать какое-нибудь бессмысленное преобразование через iconv() типа из UTF-8 в UTF-16 и обратно. Если символ обратно сконвертировалось в тот же самый -- значит все окей, иначе -- заменяем на "?". Но я не знаю как корректно будут вести себя эти функции с некорректными строками. Есть ли какой-то более простой и верный способ осуществить желаемое?



mysql_real_escape_string не помогает?
Re[2]: Проверить UTF-8 строку на UTF-8 в PHP
От: Geri Россия http://web-notes.ru/
Дата: 16.03.09 10:32
Оценка:
Здравствуйте, dkameleon, Вы писали:

D>mysql_real_escape_string не помогает?


Кажется ты и прав. Я использовал mysql_escape_string() и прежде просто не сталкивался с такой проблемой. Спасибо. А что если все-таки мне придет на вход совсем не UTF данные (бинарная строка)? Как MySQL сохранит ее в поле с UTF-ным коллэйшином?
-- С уважением, Павел Мелехов, Екатеринбург.
Re: Проверить UTF-8 строку на UTF-8 в PHP
От: MozgC США http://nightcoder.livejournal.com
Дата: 16.03.09 18:21
Оценка:
Вот тут человек написал функцию для проверки строки на utf8:
http://zhilinsky.ru/wp-content/uploads/files/Other/Development/unicode/detect_utf.phps
Проверьте хорошенько и при необходимости измените например чтобы заменять левые символы на знак вопроса, хотя я считаю что в большинстве случаев это некорректно.
Re[3]: Проверить UTF-8 строку на UTF-8 в PHP
От: dkameleon Украина http://dkameleon.com
Дата: 16.03.09 18:36
Оценка:
Здравствуйте, Geri, Вы писали:

G>Здравствуйте, dkameleon, Вы писали:


D>>mysql_real_escape_string не помогает?


G>Кажется ты и прав. Я использовал mysql_escape_string() и прежде просто не сталкивался с такой проблемой. Спасибо. А что если все-таки мне придет на вход совсем не UTF данные (бинарная строка)? Как MySQL сохранит ее в поле с UTF-ным коллэйшином?


На сколько я знаю, они так и упадут внутрь в бинарном виде.
можешь поэкспериментировать — запихнуть в базу картинку, а потом извлечь её
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.