【问题标题】:Access character in a string with square braces doesn't output correctly带有方括号的字符串中的访问字符无法正确输出
【发布时间】:2016-11-13 10:38:46
【问题描述】:

我有一个字符串,我想访问ä 字符。但它输出的是问号而不是正确的字符。

这是我的代码。

$array = array('ä', 'b', 'c');
$string = 'äbc';
echo $string; // äbc
echo '<br />';
echo $string[0]; // ?
echo '<br />';
echo $array[0]; // ä

DEMO

谁能告诉我为什么?

更新

echo strlen($string); // returns 4
echo mb_substr($string, 0, 1); // ä

【问题讨论】:

  • 我认为这与字符编码有关,如果您将 ä 替换为 x 它会按预期工作。
  • @Celeritas $array[0] 返回正确的值。
  • 这实际上是这个问题的重复,虽然很难说stackoverflow.com/questions/13508937/…
  • @Celeritas: 问题已被编辑...而且string[0] 无论如何都不能单独处理多字节字符...
  • 肯定有 dunning-kruger...

标签: php arrays string


【解决方案1】:

根据您的字符集,字母 ä 是一个多字节字母。当您使用数组访问访问字符串时,它会返回第一个字节。如果是多字节 ä,则返回不可打印的控制字符。

使用 array-access 访问数组会返回第一个元素,无论它的长度如何,在本例中为多字节 ä。

【讨论】:

    【解决方案2】:

    你需要像这样使用mb_substr()

    $array = array('ä', 'b', 'c');
    $string = 'äbc';
    echo $string; // äbc
    echo '<br />';
    echo mb_substr($string, 0, 1, 'UTF8'); // replace UTF8 with whatever charset you are using
    echo '<br />';
    echo $array[0]; // ä
    

    DEMO

    原因是因为 PHP 假定字符占用一个字节。但在您使用 ä 的情况下,情况并非如此,因此您需要使用 mb_substr() 而不是索引或 substr()。

    我强烈推荐阅读这个问题的答案Get first character of UTF-8 string

    【讨论】:

      猜你喜欢
      • 2013-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-14
      • 1970-01-01
      相关资源
      最近更新 更多