Intereting Posts
magento ограничение количества возвращенных предметов в вызове коллекции продуктов Путь текущего скрипта PHP относительно корня документа bootstrap twitter datepicker + modal – календарь на родительском экране вместо модального экрана Использование Hook_form_alter для переданных значений веб-формы PHP json_decode возвращает пустой массив PHP Fix Warning: Невозможно изменить информацию заголовка – уже отправленные заголовки Существуют ли какие-либо существенные причины для использования isset () над @ в php разница между функцией и функцией Может ли PHP определить, выполняется ли его запуск из задания cron или из командной строки? AngularJS потоковое аудио с сервера PHP 2 Yii как обновить все записи? Кэширование с помощью PHP для снятия стресса с MySQL Подзапрос Доктрины в InnerJoin Использование переменной PHP $ _SESSION для хранения больших символов данных Загрузка файла HTTP: мониторинг загрузки

Что изменит мою строку UTF-8 в ASCII?

У меня есть следующий код:

$string = $this->getTextFromHTML($html); echo mb_detect_encoding($string, 'ASCII,UTF-8,ISO-8859-1'); $stringArray = mb_split('\W+', $string); $cleaned = array(); foreach($stringArray as $v) { $string = trim($v); if(!empty($string)) array_push($cleaned, $string); } echo mb_detect_encoding($stringArray[752], 'ASCII,UTF-8,ISO-8859-1'); 

Вышеприведенное возвращает:

 // UTF-8 // ASCII 

Какая часть моего кода превращает мою строку в ASCII ? Или я неправильно определяю кодировку?

Строки не имеют фактического связанного кодирования, они просто байтовые массивы. mb_detect_encoding не сообщает вам, какая кодировка имеет строка, она просто пытается ее обнаружить . Это означает, что он принимает несколько догадок (ваш второй аргумент) и сообщает вам, что первое является действительным.

Ваша исходная строка, вероятно, содержит некоторые символы, отличные от ASCII, поэтому ASCII не является допустимой кодировкой для нее, но UTF-8. Когда вы позже тестируете подстроку оригинала, эта подстрока, вероятно, содержит только символы, которые действительны в ASCII, и поскольку ASCII является первой проверенной кодировкой, это угаданный результат. Любая строка ASCII также действительна UTF-8, поэтому нет реальной проблемы или «преобразования», которое произошло.

Как упоминалось в комментариях @Phylogenesis, символы ASCII под 0x7F действительны UTF-8. Если в ваших данных нет знака порядка байтов , текст является действительным ASCII и UTF-8. Вы указали, что ASCII является опцией перед UTF-8, поэтому он возвращается.

Например: https://ideone.com/DupS4A

 <?php $str = "apple"; // Returns ASCII var_dump(mb_detect_encoding($str, "ASCII, UTF-8")); // 0xEFBBBF is the byte order mark in UTF-8 $str_with_bom = chr(0xEF) . chr(0xBB) . chr(0xBF) . "apple"; // Returns UTF-8 var_dump(mb_detect_encoding($str_with_bom, "ASCII, UTF-8"));