为什么var_dump会返回比字符串长度更大的值?

Bay*_*kal 4 php var-dump preg-replace

我正在努力使用API​​获取一些歌词,并将歌词字符串转换为单词数组.我在preg_replace函数中得到了一些不寻常的行为.当我使用var_dump进行一些调试时,我看到var_dump为字符串"you"返回值10,这告诉我可能有错误.之后,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]++;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是此代码返回的前4行:

string(10) “You”
string(10) “you”
string(10) “you”
string(8) “lyricyou”
Run Code Online (Sandbox Code Playgroud)

为什么var_dump为"你"返回值10?为什么preg_replace就是这样的呢?

谢谢.

dec*_*eze 12

最有可能的答案是该字符串包含"你"以外的不可打印字符.要弄清楚它究竟包含什么,你必须查看原始字节.这样做echo bin2hex($word).这会输出一个字符串666f6f...,其中每2个字符是十六进制表示的一个字节.您可以通过以下方式使其更具可读性:

echo join(' ', str_split(bin2hex($word), 2));
// 66 6f 6f ...
Run Code Online (Sandbox Code Playgroud)

现在使用您最喜欢的ASCII/Unicode表(取决于字符串的编码)来确定那些代表的单个字符以及从中获取它们的位置.

也许您的字符串是以UTF-16编码的,在这种情况下,您应该00每两个字符看到一个telltale 字节.

  • 那是"<lyric>你".浏览器将缺少的字符解释为标记. (2认同)