我创建了一个函数,将以下文本转换为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: 我已将十六进制值与其对应的值匹配。然而,当我到达奇怪的角色时,它们似乎不匹配。
答案 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;
}