У меня есть следующий код:
$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"));