PDA

Показать полную графическую версию : кодировака UTF-8 в XHTML, PostgreSQL


Demiurg
28-02-2007, 12:49
Web-приложение, страничка с формой для логина на XHTML 1.0 UTF-8, форма обрабатывается php скриптом, который сверяет
$string = "md5".md5($password.$login);
if ($data[0] == $string){ ... }
где $data[0] - (SELECT passwd FROM pg_shadow WHERE usename LIKE '$login').
База PostgreSQL - UTF8. Вобщем логина не получается. Раньше для логина пользователей заводил отдельные таблицы для пользователей и групп, сейчас хочу воспользоваться нативными средствами PostgreSQL... раньше работало, но раньше и странички и база были в KOI8... а тут такой гемор с кодировками при работе с XMLHttpRequest, что решил лучше уж сейчас на UTF-8 переходить, чем потом, когда приложение разрастётся...
Скрипт login.php простейший (пока), выводит только md5 суммы.
Для отладки стал выводить (echo) получившуюся md5 сумму и сумму, которую извлекаю из базы, на экране все сходится, только комментарии на русском языке - кракозябры... стоит в браузере поставить жестко UTF8 - сумма которую я вычисляю, в UTF-8 уже другая... а сумма, которую я извлекаю из базы остаётся без изменения при переключении кодировок в браузере (при переключении, на экране свой вид не меняет)... как я понимаю, $_POST['login'] и $_POST['password'] попадают в login.php в кодировке отличной от UTF-8... логичный вопрос, а почему?
Фу, объяснил как мог... :)

Sham
28-02-2007, 16:41
Demiurg а сам скрипт какую кодовую страницу использует? Все должно соответствовать...

Demiurg
28-02-2007, 17:04
он никакую таблицу не использует, т.е. ни каких HTML заголовков в нем нет, но сама кодировка скрипта - UTF-8. После его исполнения браузер не знает кодировку документа, потому вывод (echo) - вместо русских букв кракозябры... а md5 суммы по внешнему виду совпадают, как только меняю в браузере на UTF-8, сразу видны русские буквы, а вид подсчитанной суммы изменяется (вид хеша из БД не изменяется)...
login.php без смены кодировки в браузере:

---кракозябры---
pass = md572c4bf92e86a141127e41e9ca1265a6f <- это сумма извлеченная из базы
hash = md572c4bf92e86a141127e41e9ca1265a6f <- это подсчитанная md5 сумма

меняем кодировку в браузере (без перезагрузки странички) [Вид->Кодировка->UTF8] (что бы увидеть русский текст, а не кракозябры):

Неверное имя пользователя или пароль.
pass = md572c4bf92e86a141127e41e9ca1265a6f
hash = md5d41d8cd98f00b204e9800998ecf8427e

^- вот так преобразуется страница после установки кодировки в UTF8...
Пробовал в начале скрипта написать:

setlocale(LC_ALL,'ru_RU.UTF-8');

безрезультатно.

Sham
28-02-2007, 17:30
После его исполнения браузер не знает кодировку документаперед выводом: header("Content-Type: text/html; charset=UTF-8");'ru_RU.UTF-8'Где взял? Может просто "UTF-8"?

Demiurg
28-02-2007, 19:27
'ru_RU.UTF-8' в инете где-то нарыл. Исправление на UTF-8 тоже ничего не дало.

Sham
28-02-2007, 20:48
md5 из базы то при какой кодировке создавался (когда в базу загонялся)? Такую же и надо юзать у клиента, или перекодировать данные клиента перед хешированием (с пом. iconv). Видимо из UTF-8 в koi8-r... $string = "md5".md5(iconv("UTF-8", "KOI8-R", $password.$login));

mar
01-03-2007, 13:24
ru_RU.UTF-8 - это для установки кодировок локали на unix-машине - к броузеру отношение явно не имеет =)

Demiurg
01-03-2007, 17:22
Пароль создавался в базе UTF-8 (у базы родная кодировка UTF-8), потому когда мы его извлекаем он уже в UTF-8; $_POST['login'] и $_POST['password'] приходят к нам со странички index.xhtml (которая в UTF-8)... неужели данные, которые мы вводим в форму, имеют кодировку локали ОС? (в случае с FreeBSD - это KOI8-R, Windows - cp1251)?

Sham
01-03-2007, 19:32
Demiurg не понятно... в какой кодировке слали свои пароли пользователи, когда регистрировались? KOI8? Тады и сравнивать надо предварительно перекодировав в KOI8... кодировка базы - дело десятое...

Demiurg
02-03-2007, 12:28
Sham Данные, которые мы вводим в форму, имеют кодировку локали ОС (вне зависимости от того какую кодировку имеет документ с формой)???

Sham
02-03-2007, 18:47
Demiurg вводишь то - да (а по другому и никак), но afaik форма идет в кодировке странички (при преобразовании данных формы в тело запроса используется указанная (текущая) кодировка страницы)...

mar
02-03-2007, 21:08
Demiurg
кодировка локали сервера вообще роли не играет.
В остальном, по-моему Sham все изложил.

Demiurg
06-03-2007, 13:15
В серверном скрипте убрал setlocale, оставил только header(...), все заработало...




© OSzone.net 2001-2012