【问题标题】:PHP wrong character setPHP错误的字符集
【发布时间】:2014-03-18 09:49:24
【问题描述】:

我正在尝试从表中提取数据并将其输出为文本 (RTF) 文件。问题是内容中有一些字符被破坏了。例如,如果我有西班牙语内容,则某些字符无法识别并被更改。例如,如果我有:

'实现'

单词变成:

'实现'

通过使用断点,我可以看到来自数据库的字符串是正确的,只有当它被打印出来时,波浪号才会改变。以下是我的代码:

           header("Content-Type: application/rtf; charset=utf-8;");
           header("Cache-Control: public");
           header("Content-Description: File Transfer");
           header("Content-Disposition: attachment; filename=".$fileName .".rtf");
           header("Content-Transfer-Encoding: binary");

           echo $content;

感谢您的帮助。

杰森

【问题讨论】:

  • 你的数据库有什么编码?它必须与您页面的编码匹配
  • 你为 rtf 使用什么库?尝试使用带有 mb_ 前缀的函数
  • 安德鲁,编码和排序规则一样吗?如果是这样,我所有的表都设置为'utf8 default collat​​ion'

标签: php


【解决方案1】:

将输出字符集与表的字符集匹配或将表中的字符集转换为要输出的字符集。

假设表格使用 US-ASCII 存储数据,我们希望将其输出为 UTF-8。

$content = iconv( 'US-ASCII', 'UTF-8//IGNORE//TRANSLIT', $content );
echo $content;

这会将某些字符 EG:€ 转写为 EUR,并忽略/丢弃输出字符集不知道的字符。

如果您在表中使用 Latin-1-General 编码,请尝试使用 CP850(AKA:代码页 850,MSDOS Latin-1)而不是 US-ASCII。

http://us2.php.net/manual/en/function.iconv.php

您可以选择将查询中的编码转换为表格 例如用 mysql

SELECT convert(cast(convert(content using  latin1) as binary) using utf8) AS content

MySQL - Convert latin1 characters on a UTF8 table into UTF8

如果发送到数据库的数据使用的字符集与表不同,这很有用。例如,使用 UTF-8 排序规则将 ASCII 或 ISO-8859-1 数据发送到表/列。

要找出表格的字符编码试试:

SHOW CREATE TABLE `tablename`;

How do I see what character set a MySQL database / table / column is?

对于表格编码:

SELECT CCSA.character_set_name FROM information_schema.`TABLES` T,
       information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA
WHERE CCSA.collation_name = T.table_collation
  AND T.table_schema = "schemaname"
  AND T.table_name = "tablename";

对于列编码:

SELECT character_set_name FROM information_schema.`COLUMNS` C
WHERE table_schema = "schemaname"
  AND table_name = "tablename"
  AND column_name = "columnname";

或者,您可以尝试更改 PHP 中的字符集标头以匹配数据库表的输出。

header("Content-Type: application/rtf; charset=ISO-8859-1;");

【讨论】:

  • 感谢您的回复。我不确定我是否理解替换是如何工作的。当我使用您的代码时,它只是完全删除了有问题的字母。 ''implementación' 变成 ''implementacin' 没有 'ó'
  • 哦,好的,该链接有助于解释它。我会看看我能不能让它工作。谢谢!
  • 添加了一种方法来在你的查询中假设 mysql 数据库表
  • 那么,如果我无权访问查询(我无法对其进行更改),解决此问题的唯一方法是使用 iconv 函数?
  • 是的,您需要使用 PHP 而不是 SQL 来转换它。有几种方法,但是 iconv 通常具有最多的功能。但是您需要知道表格的字符编码才能将其转换为 UTF-8 或设置您的 charset=utf-8;表的编码类型的标头。
【解决方案2】:
  1. 检查您的数据库文本是否定义为 UTF-8(最好,数据库中的所有文本应该是相同的编码)。
  2. 检查您的页面输出是否为 UTF-8,而不是默认的 Latin-1/ISO-8859-1(或其他单字节编码,例如 Windows-1252)。
  3. 进入 phpMyAdmin 并浏览表的数据,以确保数据被实际接收和处理为 UTF-8。您需要检查 phpMyAdmin 浏览页面实际上是否以 UTF-8 显示。
  4. 如果表/字段是 UTF-8,页面是 UTF-8,但你仍然得到这两个字符,很可能是 UTF-8 备份(.sql 文件)被错误地导入为拉丁文- 1 而不是 UTF-8,并且 ó 的两个字节被单独翻译成 UTF-8 多字节字符。您必须记住在 IMPORT .sql 文件时告诉 phpMyAdmin 文件的编码内容。这很难清理,特别是如果您现在在数据库中混合了多种编码。

【讨论】:

    猜你喜欢
    • 2017-09-24
    • 2017-11-01
    • 1970-01-01
    • 2013-04-14
    • 2022-10-13
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多