我遇到以下字符编码问题,以某种方式设法将具有不同字符编码的数据保存到数据库(UTF8)中,下面的代码和输出显示2个示例字符串以及它们的输出方式。其中之一需要更改为UTF8,而另一个已经更改为。
如何/应该去检查是否应该对字符串进行编码? 例如,我需要正确输出每个字符串,那么如何检查它是否已经是utf8或是否需要转换?
我正在使用PHP 5.2,mysql myisam表:
CREATE TABLE IF NOT EXISTS `entities` ( .... `title` varchar(255) NOT NULL .... ) ENGINE=MyISAM DEFAULT CHARSET=utf8; <?php $text = $entity['Entity']['title']; echo 'Original : ', $text."<br />"; echo 'UTF8 Encode : ', utf8_encode($text)."<br />"; echo 'UTF8 Decode : ', utf8_decode($text)."<br />"; echo 'TRANSLIT : ', iconv("ISO-8859-1", "UTF-8//TRANSLIT", $text)."<br />"; echo 'IGNORE TRANSLIT : ', iconv("ISO-8859-1", "UTF-8//IGNORE//TRANSLIT", $text)."<br />"; echo 'IGNORE : ', iconv("ISO-8859-1", "UTF-8//IGNORE", $text)."<br />"; echo 'Plain : ', iconv("ISO-8859-1", "UTF-8", $text)."<br />"; ?>
Original : France Télécom UTF8 Encode : France Télécom UTF8 Decode : France T�l�com TRANSLIT : France Télécom IGNORE TRANSLIT : France Télécom IGNORE : France Télécom Plain : France Télécom
Original : Cond� Nast Publications UTF8 Encode : Condé Nast Publications UTF8 Decode : Cond?ast Publications TRANSLIT : Condé Nast Publications IGNORE TRANSLIT : Condé Nast Publications IGNORE : Condé Nast Publications Plain : Condé Nast Publications
感谢您在此上花费的时间。字符编码,我相处得不好!
更新:
echo strlen($string)."|".strlen(utf8_encode($string))."|"; echo (strlen($string)!==strlen(utf8_encode($string))) ? $string : utf8_encode($string); echo "<br />"; echo strlen($string)."|".strlen(utf8_decode($string))."|"; echo (strlen($string)!==strlen(utf8_decode($string))) ? $string : utf8_decode($string); echo "<br />"; 23|24|Cond� Nast Publications 23|21|Cond� Nast Publications 16|20|France Télécom 16|14|France Télécom
这可能是该mb_detect_encoding()功能的工作。
mb_detect_encoding()
以我有限的经验,当用作通用的“编码嗅探器”时,它不是100%可靠的-它会检查某些字符和字节值的存在以进行有根据的猜测- 但在这种情况下(它需要区别只是UTF-8和ISO-8859-1),它之间 应该 工作。
<?php $text = $entity['Entity']['title']; echo 'Original : ', $text."<br />"; $enc = mb_detect_encoding($text, "UTF-8,ISO-8859-1"); echo 'Detected encoding '.$enc."<br />"; echo 'Fixed result: '.iconv($enc, "UTF-8", $text)."<br />"; ?>
对于不包含特殊字符的字符串,可能会得到不正确的结果,但这不是问题。