2

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

这就是字符在数据库中的外观。

Ä° (should be İ)
è

当我将标题设置为

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

然后字符出来:

 İ
 �

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

 İ
 è

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

4

4 回答 4

15

您的 HTML 输出需要采用单一编码,这是无法解决的。这意味着需要先将不同编码的内容转换为您的 HTML 编码。虽然这可能与iconvor相关mb_convert_encoding,但您必须解决两个问题:

  1. 您需要知道(或猜测)内容的当前编码
  2. 您需要在任何地方手动执行此操作

例如,理论上的解决方案是选择 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 编码,根据您的问题这是合理的。

于 2013-04-23T09:25:47.753 回答
2

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

更多细节在这里mysql_set_charset

于 2013-04-23T09:44:56.387 回答
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 标头,您在上面正确地编写了它。

如果一切都正确匹配,结果应该没问题。

唯一可能的问题是,当 DB 表中的文本内容以不正确的字符编码存储时。

于 2013-04-23T09:38:31.290 回答
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;

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

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

于 2016-04-22T16:29:25.020 回答