Почему var_dump возвращает большее значение, чем длина строки?

Я работаю над тем, чтобы получить некоторые тексты песен, используя API, и преобразовать текст песни в массив слов. Я получаю необычное поведение в функции preg_replace. Когда я выполнил некоторую отладку с помощью var_dump, я вижу, что var_dump возвращает значение 10 для строки «you», которая говорит мне, что может быть что-то не так. После этого preg_replace действует странно.

Это мой код:

$source = get_chart_lyrics_data("madonna","frozen"); $pieces = explode("\n", $source); $lyrics = array(); for($i=0;$i<count($pieces);$i++){ if($i>10){ $words = explode(" ",$pieces[$i]); foreach($words as $_word){ if($_word=="") continue; var_dump($_word); $word = strtolower($_word); var_dump($word); $word = trim($word); var_dump($word); $word = preg_replace("/[^A-Za-z ]/", '', $word); var_dump($word); $lyrics[$word]++; } } } 

Это первые 4 строки, которые возвращает этот код:

 string(10) “You” string(10) “you” string(10) “you” string(8) “lyricyou” 

Почему var_dump возвращает значение 10 для «вас»? И почему preg_replace действует так?

Благодарю.

Наиболее вероятный ответ заключается в том, что строка содержит непечатаемые символы за пределами «вы». Чтобы выяснить, что именно он содержит, вам придется посмотреть на необработанные байты. Сделайте это с помощью echo bin2hex($word) . Это выводит строку типа 666f6f... , где каждые два символа являются одним байтом в шестнадцатеричной системе. Вы можете сделать это более понятным с чем-то вроде:

 echo join(' ', str_split(bin2hex($word), 2)); // 66 6f 6f ... 

Теперь используйте свою любимую таблицу ASCII / Unicode (в зависимости от кодировки строки), чтобы выяснить, что представляют собой отдельные символы, и откуда вы их получили.

Возможно, ваша строка закодирована в UTF-16, и в этом случае вы должны увидеть контрольные 00 байтов каждые два символа.