UTF-8 и код

Василий М.

Новичок
Сейчас в меня тапки полетят наверно, но все же. Я решил свой код переписать под UTF-8. C СУБД все ясно. А в от с кодом - не очень. Первый звонок прозвучал от strtolower. У него есть аналог в расширении mb_. Далее я почитал, что с trim могут быть какие-то проблемы. Люди пишут свои mb_trim, хотя trim нормально отрабатывает.

Собственно вопрос вот в чем - как код под UTF8 переписывать и как его писать?
Переписывать я так понимаю надо find+replace на все эквиваленты существующих mb_-функций?
А как писать код под UTF, если половина функций не имеет аналогов в mb_? Я так понимаю, чисто теоретически, любая строковая функция может с UTF-8 проблему создать?

В общем, расскажите.
 

WMix

герр M:)ller
Партнер клуба
а че так много со строками работаешь? в смысле режешь, длину определяешь...
те у меня код давно в утф но вот не вспомню мест где мне mb_* функции нужны были
 

HORO

Новичок
А юникод то точно нужен? БД больше места занимать будет :)
А так да, все строковые функции, которые имеют аналоги, а так же в регулярки добавлять модификатор u
Локаль ещё правильную установить
 

Василий М.

Новичок

HORO

Новичок
спрашивают зачем старое переписывать, символов не хватает? Я например свое переписывать стал когда мне понадобилась мультиязычность...
 

HORO

Новичок
тогда вроде бы это все:
- перекодировать файлы и БД
- установить локаль с кодировкой и при подключении к БД
- заменить все на mb_ если есть аналоги и установить кодировку для mb_
- добавить в регулярки с кириллицей (и тп) модификатор u
- настроить кодировку на сервере
* удалить всякие iconv :)
 

WMix

герр M:)ller
Партнер клуба
я говорю что примерами легче, код в утф не означает использование mb_ функций
 

Василий М.

Новичок
скажите, почему в строке
$s = "hellow";
$s[2];
этот вариант корректно отрабатывает, а с кириллицией уже нет?

Строки в PHP внутренне представляют из себя массивы байт. Как результат, доступ или изменение строки по смещению небезопасно с точки зрения многобайтной кодировки, и должно выполняться только со строками в однобайтных кодировках, таких как, например, ISO-8859-1.
- это из мануала.
 

AnrDaemon

Продвинутый новичок
Именно поэтому. Конструкция "$s[2]" означает третий байт линейного массива байтов. Не третий символ строки.

А по твоему вопросу, ты путаешь "код в UTF-8" и "работу с данными в UNICODE". Самому PHP похрен, в какой кодировке написан код, до тех пор пока она совместима с ASCII.
 

Василий М.

Новичок
Именно поэтому. Конструкция "$s[2]" означает третий байт линейного массива байтов. Не третий символ строки.
я это понимаю. но если у меня файл в utf-8, т.е. в многобайтовой кодировке, то почему это работает с латиницей?
А по твоему вопросу, ты путаешь "код в UTF-8" и "работу с данными в UNICODE". Самому PHP похрен, в какой кодировке написан код, до тех пор пока она совместима с ASCII.
не понял
 

Василий М.

Новичок
Символы в строках можно использовать и модифицировать, определив их смещение относительно начала строки, начиная с нуля, в квадратных скобках после строки, например, $str[42]. Думайте о строке для этой цели, как о массиве символов.
Я так понимаю - доступ через [] к строке предполагает, что строка закодирована в какой-либо однобайтовой кодировке, но у меня файл в UTF-8 - в многобайтовой кодироке. И почему это работает?
 

AnrDaemon

Продвинутый новичок
Читай. Прочитаешь - задавай вопросы, если они останутся.
 

HORO

Новичок
просто UTF-8 так устроена,
https://ru.wikipedia.org/wiki/UTF-8

Правила записи кода одного символа в UTF-8[править | править вики-текст]

1. Если размер символа в кодировке UTF-8 = 1 байт
Код имеет вид (0aaa aaaa), где «0» — просто ноль, остальные биты «a» — это код символа в кодировке ASCII;

2. Если размер символа в кодировке в UTF-8 > 1 байт (то есть от 2 до 6):
2.1 Первый байт содержит количество байтов символа, закодированное в единичной системе счисления;
 

HORO

Новичок
Я так понимаю - доступ через [] к строке предполагает, что строка закодирована в какой-либо однобайтовой кодировке, но у меня файл в UTF-8 - в многобайтовой кодироке. И почему это работает?
потому что
1. Если размер символа в кодировке UTF-8 = 1 байт
Код имеет вид (0aaa aaaa), где «0» — просто ноль, остальные биты «a» — это код символа в кодировке ASCII;
ASCII тоже идет от 0 до 7F
 
Последнее редактирование:

Redjik

Джедай-мастер
Потому что кодировка UTF-8 совместима с ASCII.

Ты что, пытаешься делать сам не знаешь что?…
Марш читать http://www.joelonsoftware.com/articles/Unicode.html
неплохая статья, спасибо

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

если уж совсем по-колхозному, то латиница занимает 1 байт, все остальное от 2х до 6ти
в основе строк, лежит Cишный массив символов, и когда ты вызываешь $s[2], это интерпретируется как, пройти 2 байта от начала и взять 3ий.

То есть если у тебя смешнаая строка, Hello мир

то Hello, каждый символ занимает 1 байт, мир, каждый символ занимает от 2 до 6ти
 
Сверху