将utf8/mixed转换为utf8并去掉非ascii字符


Convert utf8/mixed to utf8 and strip non ascii chars

如何将utf8字符串转换为iso 8859-1?

为什么imap_mime_header_decode没有检测到utf8编码的字符串?

我需要删除所有4字节的unicode字符,以便字符串适合mysql utf8

已经尝试过了,但它不起作用

$text = mb_convert_encoding($text, 'UTF-8', 'UTF-8');

代码

$input = '=?UTF-8?Q?=c3=b8en?=';
echo "$input'n";
$output = '';
foreach(imap_mime_header_decode($input) as $element){
    if($element->charset == 'utf-8'){
        echo "utf8 charset = $element->text'n";
        $output .= $element->text;
    }
    else{
        echo "default charset = $element->text'n";
        $output .= $element->text;
    }
}
// Here output should be iso 8859-1
echo "$output'n";
$string = preg_replace('/[^a-zæøåA-ZÆØÅ0-9 '-'.,:]/', '', $output);
// Back to utf8
$string = utf8_encode($string);
echo "$string'n";

输出

=?UTF-8?Q?=c3=b8en?=
default charset = øen
øen
en

我想出了这个解决方案。。首先,它转换为utf-8(包括4字节unicode字符),然后转换为iso 8859-1,然后剥离不需要的字符,最后编码为utf-8

:D

private function strip_non_ascii($string){
    $return = '';
    if(preg_match('/^='?(iso-8859-1|utf-8)'?q'?/i', $string)){
        $return = str_replace('_',' ', mb_decode_mimeheader($string));
    }
    elseif(preg_match('/^(iso-8859-1'''')(.*)$/i', $string, $matches)){
        $return = utf8_encode(rawurldecode($matches[2]));
    }
    else{
        $return = imap_utf8($string);
    }
    return utf8_encode(preg_replace('/[^a-zæøåA-ZÆØÅ0-9 '-'.,:]/', '', utf8_decode($return)));
}

使用htmlentities()将特殊字符转换为HTML实体。您可以选择指定源字符串的编码,我们鼓励您指定该编码。在您的情况下,这将是"UTF-8"。HTML实体存储在数据库中是安全的,以转义形式输出也是安全的,尽管您可以选择使用html_entity_decode将尽可能多的字符转换回您选择的编码。