Intereting Posts
Как работать с массивом, возвращаемым с PHP-скрипта с помощью AJAX? Как установить бюджет (максимальная цена звонка) в учетной записи Twilio Форма yii2 для отправки вложения Что означает символ ~ ~ в регулярном выражении PHP? Неустранимая ошибка: превышено максимальное время выполнения 400 секунд Отправка PHPMailer на несколько адресов Не удается отправить учетную запись gmail с помощью функции mail () Найти соответствующие скобки, используя регулярное выражение i18n / gettext: конфигурация setlocale в веб-приложениях mysql_connect (): Библиотека несоответствий младших версий библиотеки заголовков и клиентской библиотеки: 100005 .htaccess проблема с скрытием расширения файла и принудительной завершающей косой чертой Штрих-код WordPress для списка тегов Zend Framework 2 – аннотационные формы не работают Выделите фрагмент кода HTML с соответствующим текстом требуется более подробная привязка в Session_start () к выражению select

Возвращаемое значение php mb_strlen является странным

gb2312 – это набор символов с двумя байтами, используя mb_strlen (), чтобы проверить, что один китайский символ вернет 2, но для еще двух символов иногда бывает странно, кто-нибудь знает почему? как я могу получить нужную длину?

<?php header('Content-type: text/html;charset=utf-8');// $a="大"; echo mb_strlen($a,'gb2312'); // output 2 echo mb_strlen($a.$a,'gb2312'); // output 3 , it should be 4 echo mb_strlen($a.'a','gb2312'); // output 2, it should be 3 echo mb_strlen('a'.$a,'gb2312'); // output 3, ?> 

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

Ваша строка, вероятно, хранится как UTF-8.

Код UTF-8 для "大"E5 A4 A7 (согласно этой веб-странице ), поэтому:

 $a // 3 bytes, gb2312 -> 2 char (1 + 0.5) $a . $a // 6 bytes, gb2312 -> 3 char $a . 'a' // 4 bytes, gb2312 -> 2 char 'a' . $a // 4 bytes, first byte is <128 so will be interpreted as one // single character, gb2312 -> 3 char 

Это всего лишь предположение, но для меня это совершенно разумно, если я думаю об этом. Вероятно, вы можете обратиться к этой странице википедии .

Если вы действительно хотите протестировать, я рекомендую вам создать отдельный файл, сохраненный в кодировке gb2312, и использовать fopen или что-нибудь еще, чтобы прочитать его. Тогда вы будете уверены, что он находится в нужной кодировке.

Попробуйте настроить внутреннюю кодировку MB на UTF-8

 /* Set internal character encoding to UTF-8 */ mb_internal_encoding("UTF-8"); 

http://www.php.net/manual/en/function.mb-internal-encoding.php

Я думаю, вам нужно использовать utf-8 вместо gb2312

попробуй это:

 <?php header('Content-type: text/html;charset=utf-8');// $a="大"; echo mb_strlen($a,'utf8'); // output 1 echo mb_strlen($a.$a,'utf8'); // output 2 echo mb_strlen($a.'a','utf8'); // output 2 echo mb_strlen('a'.$a,'utf8'); // output 2, ?> 

Написав $a = "大"; в файл PHP переменная $a содержит последовательность байтов, которая находилась между кавычками в вашем файле исходного кода. Если этот файл исходного кода был сохранен в UTF-8, строка представляет собой последовательность байтов UTF-8, представляющую символ «大». Если файл исходного кода был сохранен в GB2312, это последовательность байтов GB2312, представляющая «大». Но файл PHP, сохраненный в GB2312, фактически не будет анализировать как действительный PHP, поскольку PHP нуждается в кодировке ASCII.

mb_strlen даст вам количество символов в данной строке в указанной кодировке. Т.е. mb_strlen('大', 'gb2312') ожидает, что строка будет представлением последовательности байтов GB2312 и должна возвращать 1 . Вы ошибаетесь, ожидая, что он вернет 2, даже если GB2312 – это двухбайтовое кодирование. mb_strlen возвращает количество символов .

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

Нижняя строка: ваше ожидание было неправильным, и у вас есть несоответствие между тем, что «大» действительно закодировано (независимо от того, что вы сохранили исходным кодом как), и тем, что вы скажете mb_strlen оно закодировано в ( gb2312 ). Поэтому mb_strlen не может правильно выполнять свою работу и дает вам различные случайные результаты.