【问题标题】:Why does str_replace not correctly replace these extended ascii characters?为什么 str_replace 不能正确替换这些扩展的 ascii 字符?
【发布时间】:2012-10-30 14:14:24
【问题描述】:

这是一个 UTF-8 编码的源文件。我一定遗漏了一些明显的东西,但我已经尝试了所有我能想到的排列方式。

<?php

$bad =  array( chr(130), chr(145), chr(146), chr(147), chr(148), chr(150), chr(151), chr(173), chr(160) );
$good = array( chr( 44), chr( 39), chr( 39), chr( 34), chr( 34), chr( 45), chr( 45), chr( 45), chr( 32) );

print_r($bad);
print_r($good);

 $str = <<<EOF
    bad comma ‚
    bad quote ‘
    bad quote ’
    bad quote “
    bad quote ”
    bad dash –
    bad dash —
    bad dash ­
    bad space   

EOF;
    echo $str;
    $clean = str_replace($bad, $good, $str);
    echo "\n";
    echo( $clean);

当我在浏览器中打开它并查看源代码时...

Array
(
    [0] => ‚
    [1] => ‘
    [2] => ’
    [3] => “
    [4] => ”
    [5] => –
    [6] => —
    [7] => ­
    [8] =>  
)
Array
(
    [0] => ,
    [1] => '
    [2] => '
    [3] => "
    [4] => "
    [5] => -
    [6] => -
    [7] => -
    [8] =>  
)
    bad comma ‚
    bad quote ‘
    bad quote ’
    bad quote “
    bad quote â€
    bad dash –
    bad dash —
    bad dash ­
    bad space   

    bad comma ‚
    bad quote ‘
    bad quote ’
    bad quote “
    bad quote â€
    bad dash â€"
    bad dash â€"
    bad dash Â-
    bad space   

【问题讨论】:

  • 浏览器是否知道它是 UTF-8?
  • @MrLister - 这不是重点,因为字符的替换应该发生在服务器端。

标签: php extended-ascii


【解决方案1】:

ASCII、多字节和 UTF-8 之间存在区别。

在您的情况下,这些字符是多字节字符。 “多字节”只是一种任意的非 UTF-8 编码。

您可以先将它们转换为 UTF-8 或使用 mb_ereg_replace

大多数 PHP 开发人员对字符编码知之甚少,但它是使用 C/C++ 工作时最重要的事情之一。

【讨论】:

  • 谢谢。我现在就去试试这个。如果不是其他人,您对这个 PHP 开发人员的看法是正确的 :)
  • php.net/manual/en/ref.mbstring.php 这就是为什么 PHP 有很多多字节函数 :)
  • 感谢您的帮助。我以各种方式尝试了 mb_ 函数,但仍然无法弄清楚。我最终使用了 urlencode,然后是 str_replace,然后是 urldecode。一个令人讨厌的黑客,但它让我更进一步。
  • 你可以试试:这个示例代码.... $newtext = iconv(mb_detect_encoding($text, mb_detect_order(), true), "UTF-8", $text);然后在 $newtext 上执行 str_replace
  • 谢谢。我仍然遇到问题,因为上传的 csv 文件的编码可能与预期的不同。我会试试你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-08
  • 2013-03-19
  • 2021-11-23
相关资源
最近更新 更多