substr и UTF8

Статус
В этой теме нельзя размещать новые ответы.

AHTIXPICT

Новичок
substr и UTF8

Код:
<?php
$tmpArray[2] = 'ПриветПриветПривет';
$tmpArray[2] = substr($tmpArray[2],0,13);
echo $tmpArray[2];
?>
Если пишу такое в UTF-8 то substr возвращает шесть символов и какой то непонятный знак (квадратик) - получается "Привет#" (# - неизвестный знак)
Если в windows-1251 то все нормально.

Что это может быть?

// PHP Version 5.2.3

И еще

В UTF-8
$tmpArray = 'ПриветПриветПривет';
echo strlen($tmpArray);
дает 36
 

AHTIXPICT

Новичок
тоесть это не считается ошибкой в PHP?
И других вариантов нет?
Если вдруг я хочу работать с утф а у хостера нет поддержки mb_
 

Bakti9rov

!*|=?
AHTIXPICT

еси сапсем плохо, можно CGI-версию с нужными эктеншенами собрать
 

Zetruger

ivan.chistyakov.name
если в реальной работе будут символы в диапазоне до 128, то можно substr использовать
 

phprus

Moderator
Команда форума
Zetruger
Ты не понял проблемы. Строки в PHP могут хранить символы с любыми кодами, а проблема сдесь в том, что в кодировке UTF8 символ может занимать от 1 до 6 байт, и по этому substr, которая этого не учитывает и работает с байтами может разорвать UTF8-символ.
 

phprus

Moderator
Команда форума
Zetruger
А дальше то, что substr можно использовать вне зависимости от кодов символа, но только если мы работаем с байтами(или однобайтными символами). если же нам надо работать с символами, которые могут занимать более одного байта substr может работать неправильно, так как она работает с байтами а не с символами.

Честно говоря с учетом вашего сообщения про символы с кодом меньше 128 у меня возникают сомнения, что вы знаете в каких единицах передаются числовые параметры функции substr (и не только этой).
 

phprus

Moderator
Команда форума
Zetruger
ты сам то понял что написал =)
Я то понял, а вот ты, как мне кажется, не очень. Есть такое понятие, как единицы измерения. Так вот для substr и других подобных функций единицами изменения для числовых параметров являются байты (так как функции работают с байтами), а для функций семейства mb_* числовые параметры измеряются в символах (при этом длинна символа в байтах зависит от кодировки).
 

kvf77

Red Devil
Тема закрыта.

Проблемы личного характера и бессмысленные споры между участниками не являются предметом обсуждения форума.
Обсуждайте их в привате.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху