PHP mb_substr() работает неправильно?

Этот код

print mb_substr('éxxx', 0, 1);

печатает пустое место :(

Предполагается напечатать первый символ, é. Однако это работает:

print mb_substr('éxxx', 0, 2);

Но это неправильно, потому что (0, 2) означает 2 символа...


person Alex    schedule 19.12.2012    source источник


Ответы (2)


Попробуйте передать параметр кодировки в mb_substr следующим образом:

print mb_substr('éxxx', 0, 1, 'utf-8');

Кодировка никогда не определяется автоматически.

person povilasp    schedule 19.12.2012
comment
Кодировка никогда не определяется автоматически, она всегда по умолчанию какая-то. - person deceze♦; 19.12.2012
comment
Может быть, лучше использовать mb_detect_encoding для < i>на самом деле попытаться определить кодировку? - person Alvin Wong; 19.12.2012
comment
@AlvinWong Нет. Знайте, с какой кодировкой вы работаете, другого пути нет. - person deceze♦; 19.12.2012
comment
@ Элвин Вонг, это было бы более правильно, да, но я также мог бы сказать, что использование чего-либо, кроме utf-8, можно считать авантюрным и маргинальным :) - person povilasp; 19.12.2012
comment
@deceze, не был уверен, но спасибо за разъяснение, я обновил ответ. - person povilasp; 19.12.2012
comment
тк работает. Может ли mb_substr работать как substr($string, 1), не передавая ему аргумент mb_strlen()? - person Alex; 19.12.2012
comment
@ Алекс, я думаю, это еще один вопрос, но я предполагаю, что да, потому что параметр является необязательным, как и в substr. - person povilasp; 19.12.2012
comment
да, но эта штука с UTF-8 должна идти после этого аргумента. В любом случае, nvm, я просто использую mb_strlen .. - person Alex; 19.12.2012
comment
Хорошо, тогда как насчет mb_internal_encoding вместо передачи "utf-8" ко всем mb_* функциям? Как указал Альваро Г. Викарио - person Alvin Wong; 19.12.2012
comment
@AlvinWong прав, лучше обратиться к mb_internal_encoding, если это не только использование функций, и вы планируете использовать множество функций mb_ * в своем коде. - person povilasp; 19.12.2012

На практике я обнаружил, что в некоторых системах многобайтовые функции по умолчанию используют ISO-8859-1 для внутреннего кодирования. Это эффективно разрушает их способность обрабатывать многобайтовый текст.

Установка хорошего значения по умолчанию, вероятно, решит эту и некоторые другие проблемы:

mb_internal_encoding('UTF-8');
person Álvaro González    schedule 19.12.2012