我从各种RSS订阅中阅读大量文本,并将它们插入到我的数据库中。
当然,在提要中使用了几种不同的字符编码,例如UTF-8和ISO 8859-1。
不幸的是,文本的编码有时会有问题。例子:
“Fußball”中的“ß”在我的数据库中应该是这样的:“Ÿ”。如果是“Ÿ”,则显示正确。
有时,“Fußball”中的“ß”在我的数据库中看起来像这样:“ß”。当然,这样就会显示错误。
在其他情况下,“ß”被保存为“ß”-因此没有任何变化。然后它也会被错误地显示。
我怎么做才能避免情况2和3?
我如何使所有的编码相同,最好是UTF-8?什么时候我必须使用utf8_encode(),什么时候我必须使用utf8_decode()(很清楚的效果是什么,但什么时候我必须使用函数?),什么时候我必须对输入什么都不做?
如何让所有编码都相同呢?也许使用函数mb_detect_encoding()?我能写一个函数吗?所以我的问题是:
如何找出文本使用的编码?
我如何将其转换为UTF-8 -无论旧的编码是什么?
这样的函数可行吗?
function correct_encoding($text) {
$current_encoding = mb_detect_encoding($text, 'auto');
$text = iconv($current_encoding, 'UTF-8', $text);
return $text;
}
我已经测试过了,但是不行。有什么问题吗?
mb_detect_encoding:
echo mb_detect_encoding($str, "auto");
Or
echo mb_detect_encoding($str, "UTF-8, ASCII, ISO-8859-1");
我真的不知道结果是什么,但我建议您只是使用不同编码的一些提要,并尝试mb_detect_encoding是否有效。
auto是“ASCII,JIS,UTF-8,EUC-JP,SJIS”的缩写。它返回检测到的字符集,您可以使用iconv将字符串转换为UTF-8。
<?php
function convertToUTF8($str) {
$enc = mb_detect_encoding($str);
if ($enc && $enc != 'UTF-8') {
return iconv($enc, 'UTF-8', $str);
} else {
return $str;
}
}
?>
我还没有测试过,所以不能保证。也许有更简单的方法。
从头文件中获取编码并将其转换为UTF-8。
$post_url = 'http://website.domain';
/// Get headers ///////////////////////////////////////////////
function get_headers_curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$r = curl_exec($ch);
return $r;
}
$the_header = get_headers_curl($post_url);
/// Check for redirect ////////////////////////////////////////
if (preg_match("/Location:/i", $the_header)) {
$arr = explode('Location:', $the_header);
$location = $arr[1];
$location = explode(chr(10), $location);
$location = $location[0];
$the_header = get_headers_curl(trim($location));
}
/// Get charset ///////////////////////////////////////////////
if (preg_match("/charset=/i", $the_header)) {
$arr = explode('charset=', $the_header);
$charset = $arr[1];
$charset = explode(chr(10), $charset);
$charset = $charset[0];
}
///////////////////////////////////////////////////////////////////
// echo $charset;
if($charset && $charset != 'UTF-8') {
$html = iconv($charset, "UTF-8", $html);
}
我一直在寻找编码的解决方案,这个页面可能是多年搜索的结论!我测试了你提到的一些建议,以下是我的笔记:
这是我的测试字符串:
这是一个“wròng wrìtten”字符串bùt I nèed到pù‘sòme’的特殊
Chàrs看thèm, convertèd看fùnctìon!!&就是这样!
我执行INSERT操作将该字符串保存在数据库中的字段中,该字段设置为utf8_general_ci
我的页面的字符集是UTF-8。
如果我像这样做一个INSERT,在我的数据库中,我有一些字符可能来自火星…
所以我需要把它们转换成一些“理智的”UTF-8。我尝试utf8_encode(),但仍然外星人字符入侵我的数据库…
所以我尝试使用函数forceeutf8张贴在数字8,但在数据库中保存的字符串看起来像这样:
这是一个“wròng wrà tten”的字符串bùt I nèed to pù'sòme'特殊
Chà rs看thèm, convertèd由fùnctà on!!&就是这样!
所以在这个页面上收集更多的信息,并将它们与其他页面上的其他信息合并,我用这个解决方案解决了我的问题:
$finallyIDidIt = mb_convert_encoding(
$string,
mysql_client_encoding($resourceID),
mb_detect_encoding($string)
);
现在在我的数据库中,我有了编码正确的字符串。
注意:
唯一需要注意的是mysql_client_encoding函数!
您需要连接到数据库,因为这个函数需要一个资源ID作为参数。
但是,我只是在插入之前重新编码,所以对我来说这不是问题。