为什么扩展的ascii字符(â,é等)被替换为<! - ? - >字符?

时间:2009-06-22 17:28:18

标签: php html character-encoding

为什么扩展的ascii字符(â,é等)被替换为&lt;?&gt;字符?

我附上了一张图片...但是我使用PHP从MySQL中提取数据,其中一些位置有扩展字符......我使用的是字体Arial。

您可以在此处看到屏幕截图:http://img269.imageshack.us/i/funnychar.png/

建议之后仍然发生,这就是我所做的:

我的firefox(view-&gt;编码)在添加行后设置为UTF-8,但是,选项标签内的文本仍然显示有趣的字符而不是实际的重音字符。我现在应该寻找什么?

更新 我在PHP程序中有以下内容给我的那些&lt;?&gt;字符...

ini_set( 'default_charset', 'UTF-8' );

在我的zend db对象创建之后,我正在设置以下查询:

$db->query("SET NAMES utf8;");

我将所有表格更改为UTF-8并重新插入所有数据(浪费时间),因为它从未帮助过。之前是latin1。

STATUS也在报告:

Connection:             Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 4 days 20 hours 59 min 41 sec

看看页面的来源,我明白了 &lt; option value =“Br l Lake”&gt; Br l 湖

确定 - 新更新 - 我将PHP和HTML中的所有内容更改为:

标题('Content-Type:text / html; charset = latin1');

现在它有效,给出了什么?如何将其全部转换为UTF-8?

8 个答案:

答案 0 :(得分:19)

当浏览器不知道用于角色的编码时,它就是这样做的。确保在标题或标记元中指定发送给客户端的文本的编码类型。

在HTML中:

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

在PHP中(在将任何其他内容发送到客户端之前):

header('Content-Type: text/html; charset=utf-8');

我假设您需要UTF-8编码。如果您的网站使用其他文字编码,则应将UTF-8替换为您正在使用的编码。

使用HTML指定编码时要注意的一点是,浏览器会在看到Content-Type元标记后重新开始呈现网页,因此您应该在<meta />标记之后立即包含<head />标记页面中有{1}}标记,因此浏览器不会进行任何额外的处理。

另一个常见的字符集是“iso-8859-1”(基本拉丁语),您可能需要使用它而不是UTF-8。您可以在character encodings and the web上的这篇精彩文章中找到更详细的信息。如果您需要特定类型,也可以获得详尽的list of character encodings here


如果没有其他工作,另一种(罕见)可能是您的计算机上没有安装显示该页面所需字符的字体。我已经尝试了repeating your results on my own server但没有运气,可能是因为我的机器上安装了很多字体,因此浏览器总是可以用一种字体替换另一种字体的不可用字符。

通过进一步调查我注意到的是,如果文本的编码方式与浏览器报告的编码不同,则Unicode字符可能会意外地呈现。为解决此问题,我使用了HTML character entity representation个特殊字符,因此â在我的HTML中变为&#226;é变为&#233;。一旦我这样做,无论我报告的编码是什么,我的字符都能正确呈现。

显然,您不希望将数据库修改为HTML编码Unicode字符。如果必须这样做,最好的选择是使用PHP函数htmlentities()。您应该在任何希望使用Unicode字符的数据驱动文本上使用此函数。这可能很烦人,但如果指定编码没有帮助,这是强制Unicode字符工作的最后一招。 / p>

答案 1 :(得分:3)

没有这样的标准称为“扩展ASCII”,只是一堆proprietary extensions

无论如何,有多种可能的原因,但它不是你的字体。您可以先检查MySQL中的字符集,然后查看PHP正在做什么。正如Dan所说,你需要确保PHP指定它实际使用的字符编码。

答案 2 :(得分:3)

正如其他人所说,这是一个字符编码问题。您应该阅读有关字符编码的Joel Spolsky's article

设置

header('Content-Type: text/html; charset=utf-8');
如果您的php页面正在向浏览器写入UTF-8字符,

将解决您的问题。如果文本仍然是乱码,则您的文本可能不是UTF-8;在这种情况下,您需要在Content-Type标头中使用正确的编码名称。如果您有选择,请始终使用UTF-8或其他一些Unicode编码。

答案 3 :(得分:1)

最简单的修复

ini_set( 'default_charset', 'UTF-8' );

这样您就不必担心自己手动发送Content-Type标题了。

修改

确保您实际上将数据存储为UTF-8 - 将非UTF-8数据发送到浏览器作为 UTF-8与发送UTF-8数据一样可能导致问题其他一些字符集。

SELECT table_collation
  FROM information_schema.`TABLES` T
 WHERE table_name=[Table Name];

SELECT default_character_set_name
     , default_collation_name
  FROM information_schema.`SCHEMATA` S
 WHERE schema_name=[Schema Name];

检查这些值

答案 4 :(得分:1)

有两种传输编码,PHP&lt; - &gt;浏览器和Mysql&lt; - &gt; PHP,它们需要彼此一致。设置Mysql&lt; - &gt; PHP的编码在以下问题的答案中处理:

快速回答是“SET NAMES UTF8”。

缓慢的答案是阅读其他答案中推荐的文章 - 了解正在发生的事情并进行一次精确的更改要比应用试验和错误要好得多,直到事情看起来有效。这不仅仅是一个美化UI问题,糟糕的编码配置会严重破坏您的数据。想想辛普森的情节,丽莎在她的头发上嚼口香糖,玛吉试图通过加入花生酱来摆脱。

答案 5 :(得分:0)

您应该将所有特殊字符编码为HTML实体,而不是依赖于字符集。

htmlentities()将为您完成工作。

答案 6 :(得分:0)

  

我将所有表格更改为UTF-8并重新插入所有数据(浪费时间),因为它从未帮助过。之前是latin1。

如果您的原始数据是latin1,然后将其插入UTF-8数据库将不会将其转换为UTF-8 ,AFAIK,它将插入相同的数据但现在认为它是UTF- 8,因此破裂。

如果你有一个SQL转储,我建议通过一个工具运行它来转换为UTF-8。 Notepad ++做得非常好 - 只需打开文件,检查重音字符是否正确显示,然后在菜单中找到“转换为UTF-8”。

答案 7 :(得分:0)

这些特殊字符通常由于扩展而出现。如果我们提供带有charset=utf-8的元标记,我们可以通过添加:

来消除它们
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

到您的元标记