php - UTF8 编码问题 - 有很好的例子

标签 php mysql utf-8 character-encoding

我有以下字符编码问题,不知何故,我设法将具有不同字符编码的数据保存到我的数据库 (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

最佳答案

这可能是 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 />";

?>

对于不包含特殊字符的字符串,您可能会得到不正确的结果,但这不是问题。

关于php - UTF8 编码问题 - 有很好的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4095899/

相关文章:

php - SQL帮助,无法通过连接获得所需的输出

mysql - 获取具有最大版本值但不活动的行

php - PDO UTF-8 编码问题?

java 将utf-8 2字节字符转换为1字节字符

MySQL 4.0 乱码无法转换为较新的 MySQL

mysql - SQL-Query - 使用附加动态列连接多个表

php - Codeigniter 对象未找到错误

php - 找出同一个表的一组列中是否存在值的最佳方法是什么

php - PDO和MySQL类型切换

PHP 如何创建简单的钩子(Hook)?