我有以下代码在字符串中搜索非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] . ", ";
}
}
我做错了什么以及如何解决?
答案 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,反之亦然
我的建议:值得努力将所有内容从开发转换为生产,完全使用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);
两者都给我相同的输出
£,Â,£
我认为你会有所帮助!