[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Почему строка "райд" состоит из 8 символов?
raid
Выручайте!
Был сайт на php. Пхп файлы кодировались в Windows-1251, однако в базе данных (MySQL) стояла кодировка UTF-8. При работе с базой приходилось всё время кодировать строки туда-обратно. Решил перекодировать файлы на сервере в UTF-8.

На первый взгляд операция прошла удачно, но стоило мне авторизироваться на своём сайте, как я заметил проблему.
В одном месте ник выводится вертикально следующим образом: implode('<br>', str_split($halfName)). Так вот в этом месте вместо слова Райд пхп вертикально вывел мне в аккурат 8 неизвестных символов (FF отображает их в виде вопросиков).

Входе исследований с помощью FirePHP стало ясно, что длина строк (возвращаемая strlen), состоящих из русских символов, УДВАИВАЕТСЯ blink.gif , а при применении к этим строкам любых функция (типа str_split или preg_replace) получается абракадабра.

Пожалуйста, помогите решить проблему sad.gif
Winston
Для работы со строками в юникоде нужно использовать библиотеку MB http://www.php.net/manual/ru/ref.mbstring.php
Цитата (raid @ 6.06.2013 - 17:58)
длина строк (возвращаемая strlen), состоящих из русских символов, УДВАИВАЕТСЯ

window-1251 однобайтная кодировка. UTF-8 - многобайтная,http://www.php.net/manual/ru/intro.mbstring.php
raid
Спасибо. Но функционал MB что-то не впечатляет. Пожалуй, придётся вернуться к исходному варианту.
twin
Да чего уж там, надо сразу к счетам возвращаться. Компьютер тоже может не впечатлить по такой логике)))

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
raid
А вы со мной не согласны? На сколько я заметил, MB даже не поддерживает preg-регулярки. Какие после этого могут быть разговоры?
Есть вот такой вариант. Вопрос, на сколько он безопасен с точки зрения результата.
function str_caller() {
$args = func_get_args();
$f = array_shift($args);
$r = call_user_func_array($f, str_caller_encode($args));
$r = str_caller_encode(array($r), true);
return $r[0];
}
function str_caller_encode($args, $b=false) {
foreach($args as $k => $v) {
if (is_string($v)) {
if ($b) $args[$k] = iconv('windows-1251', 'utf-8', $v);
else $args[$k] = iconv('utf-8', 'windows-1251', $v);
}
if (is_array($v)) $args[$k] = str_caller_encode($v, $b);
}
return $args;
}
function create_utf_str_func($fs) {
foreach ($fs as $v) {
eval("
if (!function_exists(utf_
$v)) {
function utf_
$v() {
\$args = func_get_args();
array_unshift(
\$args, '$v');
return call_user_func_array('str_caller',
\$args);
}
}
"
);
}
}

//например:
create_utf_str_func(array('str_split'));
utf_str_split('some string с русскими буквами');
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.