【问题标题】:Why is this the extended ascii character (â, é, etc) getting replaced with <?> characters?为什么这是扩展的 ascii 字符(â、é 等)被替换为 <?> 字符?
【发布时间】:2009-06-22 17:28:17
【问题描述】:

为什么扩展 ascii 字符(â、é 等)被 > 字符替换?

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

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

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

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

更新: 我在 PHP 程序中有以下内容,它给了我那些 > 字符...

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

查看页面的来源,我看到了

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

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

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

【问题讨论】:

  • 您使用的 Firefox 版本是什么?我试图重现您的问题,但无法重现。您正在测试的机器是否可能没有安装正确的 Unicode 字体?如果您有兴趣查看我测试过的页面,可以在这里找到:dan-herbert.com/unicode.htm
  • 奇怪,dan-herbert.com/unicode.htm 在我的同一个浏览器中看起来很完美...这样就可以消除 firefox...

标签: php html character-encoding


【解决方案1】:

这就是浏览器在不知道用于字符的编码时所做的事情。确保在标头或标记元中指定发送给客户端的文本的编码类型。

在 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 元标记,就会重新开始渲染页面,因此您应该在 &lt;head /&gt; 标记之后立即包含 &lt;meta /&gt; 标记你的页面,这样浏览器就不会做超出它需要的额外处理。

另一种常见的字符集是“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 中变成了&amp;#226;é 变成了&amp;#233;。一旦我这样做了,无论我报告的编码是什么,我的字符都会正确呈现。

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

【讨论】:

  • 我也是。对您的打字速度表示赞赏 =)
  • 调试这种可能性的一种快速方法是手动更改浏览器中的编码。例如。在 Firefox 中使用 View->Character Encoding。
  • 添加此行后,我的火狐设置为 UTF-8,但是,选项标签内的文本仍显示该字符。它完美地存储在带有重音字符的 Mysql 中。
  • 迈克,我在下面的答案中添加了一些 SQL 信息。
  • htmlentities 的东西是一个不必要的复杂性 - utf8 可以编码任何东西,事实上很可能 latin1 可以编码应用程序所需的任何字符。问号/菱形通常表示编码格式错误,如果它是浏览器找不到字体的字符,那将是一个空心的“豆腐”框。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    设置

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

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

    【讨论】:

      【解决方案4】:

      最简单的修复

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

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

      编辑

      确保您实际将数据存储为 UTF-8 - 将非 UTF-8 数据发送到浏览器 as 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];
      

      检查这些值

      【讨论】:

      • 更改表格编码既没有必要也不够。重要的是告诉 mysql 以哪种编码传输结果(“显示诸如 character_set_results 之类的变量”)。 Mysql 能够正确地将 latin1 表中的数据以 utf8 格式传输(反之亦然)。
      【解决方案5】:

      传输编码有PHP浏览器和MysqlPHP两种,需要相互一致。为 MysqlPHP 设置编码在以下问题的答案中处理:

      快速回答是“SET NAMES UTF8”。

      缓慢的答案是阅读其他答案中推荐的文章 - 了解正在发生的事情并进行精确的更改要比在似乎可行之前进行反复试验要好得多。这不仅仅是一个外观 UI 问题,错误的编码配置会严重破坏您的数据。想想《辛普森一家》中丽莎在头发上嚼口香糖的那一集,玛吉试图通过涂上花生酱来摆脱这种情况。

      【讨论】:

        【解决方案6】:

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

        htmlentities() 将为您完成这项工作。

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

          • 现在做sql转储会不会太晚了?
          • 不,我认为还是可以的——但你当然可以试一试看看。执行 SQL 转储,然后转换为 utf8 并检查字符是否正确显示。如果是,那么插入回数据库应该没问题。正如其他人所说,您仍然需要在每次页面加载时运行“SET NAMES UTF8”。
          【解决方案8】:

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

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

          到您的元标记

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-25
            • 1970-01-01
            • 2012-11-18
            • 2018-12-26
            • 2018-11-23
            • 2013-03-19
            相关资源
            最近更新 更多