将智能引号和其他实体转换为精确形式

时间:2012-02-12 16:39:35

标签: php unicode character-encoding html-entities iso

我一直致力于将字符串转换为PDF。出现的一个典型问题是偶尔会出现“智能引号”或其他utf-8字符,它会成为一个或另一个ISO字符,如“,”,“等”。下面定义的函数解决了通过将它们编码为html实体的问题,然而,当然PDF不是html。在为撇号’输入的字符串时,该函数会将其转换为’。如果我们处理HTML,这很好,但作为PDF,它将它视为一个字符串,因此它的确切形式永远不会被转换。因此,如何将htmlentity转换为 exact 形式的字符?

function htmlallentities($str){
    $res = '';
    $strlen = strlen($str);
    for($i=0; $i<$strlen; $i++){
        $byte = ord($str[$i]);
        if($byte < 128) { // 1-byte char
            $res .= $str[$i];
        } elseif($byte < 192) { // invalid utf8
        } elseif($byte < 224) { // 2-byte char
            $res .= '&#'.((63&$byte)*64 + (63&ord($str[++$i]))).';';
        } elseif($byte < 240) { // 3-byte char
            $res .= '&#'.((15&$byte)*4096 + (63&ord($str[++$i]))*64 + (63&ord($str[++$i]))).';';
        } elseif($byte < 248) { // 4-byte char
            $res .= '&#'.((15&$byte)*262144 + (63&ord($str[++$i]))*4096 + (63&ord($str[++$i]))*64 + (63&ord($str[++$i]))).';';
        }
    }
    return $res;
}

(感谢@Floern,https://stackoverflow.com/a/4583465/810821

如果我使用了错误的术语,我很抱歉。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果智能撇号(')成为,那么问题是UTF-8编码数据被解释为windows-1252编码中的字节序列。您应该找到并修复导致错误解释的代码部分,而不是在数据搞砸后尝试修复此问题。