非ASCII字符转换为正方形

时间:2014-08-17 13:14:25

标签: php ascii

我有以下代码在字符串中搜索非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] . ", ";
    }
}

我做错了什么以及如何解决?

2 个答案:

答案 0 :(得分:1)

您假设1 character = 1 byte

对于UTF-8 / UTF-16等,这个假设是错误的。

UTF-8 e.a.由多字节字符组成:1 character = 1 to 3 bytes

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

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

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

  1. 一般不需要
  2. 将始终导致某些字符在两者中都不可用 编码(即€符号是其中之一)
  3. 从长远来看将是一场维护噩梦
  4. 我的建议:值得努力将所有内容从开发转换为生产,完全使用UTF-8。之后所有问题都消失了。

答案 1 :(得分:0)

我为你提供两种方式。首先使用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);

两者都给我相同的输出

£,Â,£

我认为你会有所帮助!

相关问题