将Window-1252转换为UTF-8问题

时间:2018-02-20 12:19:52

标签: php character-encoding

我创建了一个函数,将以下文本转换为UTF-8,因为它似乎是Windows-1252格式,因为它是从Word文档复制到数据库表的。

  

测试怪异角色的修正

这似乎解决了狡猾的’角色。但是我没有得到以下内容:

  

德文郡最知名的经销商

通过相同的功能传递以下内容时:

  

德文郡最知名的经销商

以下是进行转换的代码:

function Windows1252ToUTF8($text) {
    return mb_convert_encoding($text, "Windows-1252", "UTF-8");
}

修改 由于持有数千个自定义记录,因此无法更改数据库。我试过以下但mb_detect_encoding认为character’s correction是UTF-8。

function Windows1252ToUTF8($text) {
    if (mb_detect_encoding($text) == "UTF-8") {
        return $text;
    }
    return mb_convert_encoding($text, "Windows-1252", "UTF-8");
}

编辑2: 刚刚尝试了PHP Documentation

中的示例
$str = 'áéóú'; // ISO-8859-1
echo "<pre>";
var_dump(mb_detect_encoding($str, 'UTF-8')); // 'UTF-8'
var_dump(mb_detect_encoding($str, 'UTF-8', true)); // false
echo "</pre>";
die();

但这只是输出:

  

string(5)“UTF-8”   string(5)“UTF-8”

所以我甚至无法检测到字符串的编码:S

编辑3: 这似乎可以解决问题:

function Windows1252ToUTF8($text) {
    $badChars = [ "â", "á", "ú", "é", "ó" ];
    $match = preg_match("/[".join("",$badChars)."]/", $text);
    if ($match) {
        return mb_convert_encoding($text, "Windows-1252", "UTF-8");
    }
    return $text;
}

编辑4: 我已将十六进制值与其对应的值匹配。然而,当我到达奇怪的角色时,它们似乎不匹配。

enter image description here

1 个答案:

答案 0 :(得分:1)

以下似乎可以解决问题。不是我希望它通过检查特定字符来工作的方式,但它确实有效。

function Windows1252ToUTF8($text) {
    $badChars = [ "â", "á", "ú", "é", "ó" ];
    $match = preg_match("/[".join("",$badChars)."]/", $text);
    if ($match) {
        return mb_convert_encoding($text, "Windows-1252", "UTF-8");
    }
    return $text;
}

修改

function Windows1252ToUTF8($text) {
    // http://www.fileformat.info/info/charset/UTF-8/list.htm
    $illegal_hex = [ "c3a2", "c3a1", "c3ba", "c3a9", "c3b3" ];
    $match = preg_match("/".join("|",$illegal_hex)."/", bin2hex($text));
    if ($match) {
        return mb_convert_encoding($text, "Windows-1252", "UTF-8");
    }
    return $text;
}