Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите понять где проблема

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: кодировка UTF-8 и Windiws-1251
goleafserg
Отправлено: 22 Марта, 2016 - 12:11:06
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2016  


Помог: 0 раз(а)




В общем ситуация странная, вот простенький код:
<?header("Content-Type: text/html; charset=windows-1251");

$a = "Строка";
$b = strlen($a);
$h = $a{$b-1};

echo <<<label1
Количество букв = {$b}ть <br>
Последняя буква = $h <br>
label1
?>
Все работает нормально, все выводится. Но кода я тоже самое пишу в кодировке UTF-8 выводится такая вот хрень:
Количество букв = 12ть
Последняя буква = �
С чем это связано подскажите пожалуйста?!!
P.S Версия PHP/5.3.3

(Отредактировано автором: 22 Марта, 2016 - 12:14:19)

 
 Top
Мелкий Супермодератор
Отправлено: 22 Марта, 2016 - 12:33:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Различие между символом и байтом.
strlen и обращение к строки как массиву - оперируют байтами, а не символами.

Для cp1251 байт = символ, для utf8 - это разные вещи. Используйте функции mb_*


-----
PostgreSQL DBA
 
 Top
goleafserg
Отправлено: 22 Марта, 2016 - 12:40:39
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2016  


Помог: 0 раз(а)




т.е в кодировке utf-8 я не могу обращаться к символу строки через такую вот конструкцию $str[1] или $str{1}?
как правильно тогда?
(Добавление)
из мануала
Цитата:
Внимание
Строки в PHP внутренне представляют из себя массивы байт. Как результат, доступ или изменение строки по смещению небезопасно с точки зрения многобайтной кодировки, и должно выполняться только со строками в однобайтных кодировках, таких как, например, ISO-8859-1.

Я так понимаю в utf-8 такое обращение нельзя делать? только cp1251 нужно использовать?

(Отредактировано автором: 22 Марта, 2016 - 12:43:24)

 
 Top
TuX560
Отправлено: 22 Марта, 2016 - 13:17:20
Post Id


Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Дек. 2015  


Помог: 3 раз(а)




goleafserg пишет:
т.е в кодировке utf-8 я не могу обращаться к символу строки через такую вот конструкцию $str[1] или $str{1}?
как правильно тогда?

Вам же ответили: использовать mb_* для работы с многобайтными кодировками, к примеру как-то так: mb_substr($str,mb_strlen($str)-1,1,"UTF-8");
 
 Top
goleafserg
Отправлено: 22 Марта, 2016 - 14:34:12
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2016  


Помог: 0 раз(а)




да это я понял, просто думал может как то попроще можно.
а вобще какую кодировку лучше использовать для написания скриптов?
 
 Top
esterio
Отправлено: 22 Марта, 2016 - 16:45:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




goleafserg пишет:
а вобще какую кодировку лучше использовать для написания скриптов?

UTF-8
 
 Top
goleafserg
Отправлено: 23 Марта, 2016 - 04:00:49
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Март 2016  


Помог: 0 раз(а)




понял, всем спасибо за ответы.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB