PHP错误的字符集

时间:2014-02-18 14:46:18

标签: php

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

  

'implementación'

这个词改为:

  

'implementación'

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

           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;

感谢您的帮助。

杰森

2 个答案:

答案 0 :(得分: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中的charset标头以匹配数据库表的输出。

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

答案 1 :(得分:0)

  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文件)被错误地导入为Latin- 1而不是UTF-8,并且ó的两个字节被单独翻译为UTF-8多字节字符。你必须记得在导入.sql文件时告诉phpMyAdmin文件编码的内容。这很难清理,特别是如果你现在在数据库中混合了编码。