2013-11-22 3 views
0

Я пытаюсь изменить набор символов из latin1 в utf8преобразование из латинского набора символов в юникод

Проблема: Пароли не работает для французских символов. Пароль работает для специальных символов (например, котировки, скобки, знак доллара и т. Д.). Если преобразовать набор символов в кодовой части обратно в latin1, я могу войти, используя французские символы, но не с utf8

Что я сделал до сих пор:

  • Изменен набор символов база данных; Я вижу, что все типы столбцов отображаются как utf8. Я выполнил запрос как в базе данных, так и на уровне таблицы .
  • Изменен набор символов для части кода для utf8.
  • Мое тестирование показывает, что все круто, я вижу акцентированные французские персонажи отлично, и ничто не кажется сломанным. Только для Паролей дает мне проблемы.

Пожалуйста, предложите:

  • мне нужно изменить сами данные в utf8, а также делать?
  • Я запустил команду alter table, и он изменил символ столбца на utf8, я что-то упустил?

Я подозреваю, что это может быть причиной, потому что пароли работают нормально, если я конвертирую часть кода в latin1. Поэтому я думаю, что код и база данных были latin1, поэтому он может распознавать специальные символы, но когда я меняю его на utf8, он не может интерпретировать специальные французские буквы, поскольку они были первоначально сохранены как latin1.

Оба варианта PHP и MySQL являются последними.

Поскольку мой ответ был долгим, я решил добавить его здесь:

Функции хэширования является очень сложным, она использует комбинацию md5, encode64 и функции крипт. Я заметил, что результирующий pwd отличается для латинского и юникодного. Именно по этой причине я подозревал, что ранее созданный pwd с использованием latin1 может соответствовать pwd, а не unicode после преобразования. Опять же, это происходит только для французских букв, а не для диапазона ascii от 0 до 127. Я не уверен, как справиться с ситуацией, когда существующие пользователи могут успешно войти в систему, а набор символов изменился на unicode-8. Я не могу использовать iconv(), так как я не могу различить, создаются ли пароли с использованием latin1 или unicode8. Нужно ли мне также изменять данные в дополнение к изменению базы данных и как? Если я думаю правильно, то преобразование данных в unicode8 может заботиться и о французских персонажах?

+0

Может быть, что ваш хэш-функция генерирует различные хэш из latin1 и utf8 наборов символов? Поэтому вы должны, вероятно, перефразировать все пароли. Если это возможно. –

+0

Обновить код и кодировку базы данных? – Anthony

+0

Если ваши текущие хэши из латинского-1 (вероятно, на самом деле кода Windows 1252) представляют пароль, тогда да, вам нужно будет преобразовать в латинский-1 перед сопоставлением, а это значит, что вы никогда не сможете получить пароль с символом не латинского-1. В этом случае вы должны обнаружить попытку использовать его, когда пароль установлен, и дать подходящее сообщение об ошибке вместо создания непригодной учетной записи. Если этот подход неприемлем, вам придется выполнить процесс миграции паролей (вероятно, хорошая идея, так что вы можете перейти к bcrypt et al) – bobince

ответ

-1

, если вам нужно преобразовать символ из некоторого Unicode в другую вы можете использовать эту функцию

iconv() 
Смежные вопросы