2

我开发了一个 PHP/MySQL 应用程序,其中存储了一个表名。这些名称有时包含特殊字符(如 é、à、ë、...)。

创建表时,我忘记将搭配项设置为 UTF-8,现在设置为 LATIN1_SWEDISH_CI。所以有些数据在 phpMyAdmin 中显示不正确。但是当我在 PHP 页面上显示名称时,这些特殊字符会正确显示。这是我使用 UTF-8 的 PHP 文件的摘录

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

就像我说的那样,特殊字符会按应有的方式显示。到目前为止……没问题。

但现在我想将该数据导出到 CSV 文件中,你猜怎么着?CSV 文件中不包含特殊字符。我的 PHP 导出文件包含以下代码行:

<?php
mysql_query("SET NAMES utf8");
header('Content-Type: text/html; charset=UTF-8');
...

但是没有显示特殊字符?

有没有人有这个问题的解决方案?因为我觉得在 Excel 中打开 CSV 并使用“查找和替换”有点荒谬。使用 HTML 转义码是不可能的。这就是为什么有 UTF-8 的原因,不是吗?

4

1 回答 1

2

您存储了 UTF-8 编码的数据,MySQL 将其视为 Latin-1 数据。MySQL 不会抱怨这一点,因为任何任意字节序列都是有效的 Latin-1。因为用于检索数据的连接的连接字符集与用于插入数据的连接字符集相同,所以正确的数据会显示在您的网页上。但是,如果您在一个煞费苦心地显示实际存储的字符的实用程序中查看数据,您会看到编码错误的文本,因为那是您实际存储的内容。

您需要做两件事:首先,您需要更改数据库连接代码,以确保您与数据库建立的所有连接都使用 UTF-8 字符集。这可以使用设置文件或仅通过在每次连接时发出 SET NAMES 语句来完成。

其次,您需要更正已经存储在数据库中的错误编码数据。不要alter table直接将字符集改为UTF-8;如果这样做,您将得到双 UTF-8 编码的数据。相反,使用 alter table 查询将列更改为二进制字符集,然后再将 table 更改为 UTF-8。

于 2012-04-24T10:53:57.650 回答