Latin-1 / UTF-8编码php

时间:2013-04-23 09:21:53

标签: php mysql utf-8

我有一个UTF-8编码的db,混合了Latin-1。 (我认为这就是问题)

这是角色在数据库中的外观。

Ä° (should be İ)
è

当我将标题设置为

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

然后角色出现:

 İ
 �

当我删除标题时,它们会在数据库中显示出来。我希望他们这样出来:

 İ
 è

如果可能的话,我正在寻找一种方法来解决这个问题。我目前无法纠正数据本身,这是正确的做法。

4 个答案:

答案 0 :(得分:10)

您的HTML输出需要采用单一编码,没有办法解决这个问题。这意味着需要首先将不同编码中的内容转换为HTML编码。虽然可以使用iconvmb_convert_encoding,但您必须解决两个问题:

  1. 您需要知道(或猜测)内容的当前编码
  2. 您需要在任何地方手动执行此操作
  3. 例如,理论上的解决方案是选择UTF-8作为HTML编码,然后对要输出的所有字符串执行此操作:

    $string = '...'; // from the database
    
    // If it's not already UTF-8, convert to it
    if (mb_detect_encoding($string, 'utf-8', true) === false) {
        $string = mb_convert_encoding($string, 'utf-8', 'iso-8859-1');
    }
    
    echo $string;
    

    上面的代码假定非UTF-8内容是用latin-1编码的,根据你的问题这是合理的。

答案 1 :(得分:2)

也许您应该选择utf8作为连接字符集,它将检索正确的字符。默认值可能不适合您所需的字符。

此处有更多详情mysql_set_charset

答案 2 :(得分:1)

在这种情况下,您必须整理3件事。几乎无关紧要的是DB表内容的字符编码是什么,因为在MySQL中,您可以设置DB服务器和PHP脚本之间通信的字符编码。见http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html 如果以正确的方式使用SET NAMES / SET CHARACTER SET,则可以将通信设置为无论如何都要获得UTF-8字符。

您需要检查PHP脚本文件的“物理”(字节级)字符编码。在文本编辑器/ IDE中将其设置为UTF-8,无论您使用哪个。

你需要使用适当的HTML标题,你在上面正确地写了它。

如果所有事情都匹配得恰到好处,结果应该没问题。

唯一可能的麻烦,当数据库表中的文本内容存储了错误的字符编码时。

答案 3 :(得分:1)

我知道这是一篇很老的帖子,但如遇到这个问题,我就会采取以下措施解决问题。

1)将表导出到sql

2)用notepad ++或其他编辑器打开sql

3)复制所有内容然后将其粘贴到带有BOM(或记事本并保存为unicode)的新文件中

4)我在导出的文件中有这个:

   /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
   /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
   /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
   /*!40101 SET NAMES latin1 */;

我将SET NAMES从latin1更改为utf8

   /*!40101 SET NAMES utf8 */;

如果您没有此行,只需添加此新行即可    来自

CREATE TABLE IF NOT EXISTS `table_name` (
  // column names....
) ENGINE=MyISAM AUTO_INCREMENT=301 DEFAULT CHARSET=latin1;

变化

DEFAULT CHARSET=latin1;

DEFAULT CHARSET=utf8;

删除旧表(当然是备份旧表)并导入这个新文件。

它对我有用。希望有所帮助。