Я пытаюсь изменить набор символов из 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 может заботиться и о французских персонажах?
Может быть, что ваш хэш-функция генерирует различные хэш из latin1 и utf8 наборов символов? Поэтому вы должны, вероятно, перефразировать все пароли. Если это возможно. –
Обновить код и кодировку базы данных? – Anthony
Если ваши текущие хэши из латинского-1 (вероятно, на самом деле кода Windows 1252) представляют пароль, тогда да, вам нужно будет преобразовать в латинский-1 перед сопоставлением, а это значит, что вы никогда не сможете получить пароль с символом не латинского-1. В этом случае вы должны обнаружить попытку использовать его, когда пароль установлен, и дать подходящее сообщение об ошибке вместо создания непригодной учетной записи. Если этот подход неприемлем, вам придется выполнить процесс миграции паролей (вероятно, хорошая идея, так что вы можете перейти к bcrypt et al) – bobince