【发布时间】:2011-05-04 23:58:13
【问题描述】:
我有以下字符编码问题,不知何故,我设法将具有不同字符编码的数据保存到我的数据库 (UTF8) 下面的代码和输出显示了 2 个示例字符串及其输出方式。其中 1 个需要更改为 UTF8,而另一个已经更改为 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 />";
?>
输出 1:
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
输出 2:###
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
【问题讨论】:
-
从上面看,第一个字符串已经是UTF-8,第二个是ISO-8859-1。但是你的问题是什么?
-
我每个字符串都可以正确输出,那么如何检查是否已经是utf8或者是否需要转换呢?
-
不确定,但请看这里 - dev.mysql.com/doc/refman/5.0/en/… - 结合 mysql 功能,您只需一个更新查询即可完成您想要的操作。
-
我也认为修复一次数据库比在每个请求上重新编码字符串更好。
标签: php mysql utf-8 character-encoding