【问题标题】:Non ASCII Characters being converted to squares非 ASCII 字符被转换为正方形
【发布时间】:2014-08-17 13:14:24
【问题描述】:

我有以下代码,它在字符串中搜索非 ASCII 字符并通过 AJAX 查询返回。

$asciistring = $strDescription;
for ($i=0; $i<strlen($asciistring); $i++) {  
    if (ord($asciistring[$i]) > 127){
        $display_string .= $asciistring[$i];
    }
}

如果 $strDescription 包含 £(字符 #156),则上面的代码可以正常工作。但是,我想用逗号分隔找到的每个非 ASCII 字符。当我修改下面的代码时,它会将 £ 字符转换为正方形。

$asciistring = $strDescription;
for ($i=0; $i<strlen($asciistring); $i++) {  
    if (ord($asciistring[$i]) > 127){
        $display_string .= $asciistring[$i] . ", ";
    }
}

我做错了什么,我该如何解决?

【问题讨论】:

  • “我做错了什么?” – 您正在对使用多字节字符编码的字符串中的单个字节进行操作,这当然会出错.
  • 让我更具体一点:我做错了什么以及如何解决?

标签: php ascii


【解决方案1】:

你假设1 character = 1 byte。

当涉及到 UTF-8 / UTF-16 等时,这个假设是错误的。

UTF-8 即由多字节字符组成:1 character = 1 to 3 bytes。

因此,您的 8 位字节循环无法处理任何 UTF-8 字符。

改用mb_... 函数 - 多字节字符串函数。

另外:将 ASCII 转换为 UTF-8,反之亦然

  1. 一般不需要
  2. 将始终导致某些字符在任何一个中都不可用 编码(即€符号就是其中之一)
  3. 从长远来看将是一场维护噩梦

我的建议:将所有一切从开发转向生产以完全使用 UTF-8 是值得的。之后所有问题都迎刃而解了。

【讨论】:

    【解决方案2】:

    我为您提供两种方式。首先使用 utf8_decode。你可以试试这些

    $asciistring = 'a£bÂc£d';
    $asciistring =  utf8_decode($asciistring);
    

    第一种方式 preg_match_all

    if (preg_match_all('/[\x80-\xFF]/', $asciistring, $matches)) {
        $display_string = implode(',', $matches[0]);
    }
    

    你写的第二种方式

    $display_string = array();
    for ($i=0; $i<strlen($asciistring); $i++) {
        if (ord($asciistring[$i]) > 127)
        {
            $display_string[] = $asciistring[$i];
        }
    }
    $display_string = implode(',', $display_string);
    

    两者都给我相同的输出

    £,Â,£
    

    我认为你会有所帮助!

    【讨论】:

    • Does not work 不知何故,英镑在循环中被分成两个字符,当你将它们分开时,它会按照 OP 的描述中断
    • 好主意,但正如 kingkero 所说,结果是一样的。
    • 现在每个非 ASCII 字符得到 1 个,而不是 2 个方块 - 请参阅此处 codepad.org/MIDjAnG3
    • 对不起@Dion,它给我的输出为字符串(5)“£,Â,£”。我的 PHP 版本 5.3.5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 2014-10-21
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多