【问题标题】:Error with utf8 characters and htmlspecialchars in yiiyii 中的 utf8 字符和 htmlspecialchars 出错
【发布时间】:2012-06-14 19:57:15
【问题描述】:

我在 yii 中的字符编码有问题。 如果我创建一个新的 webapp:

 ./Yii-framework/framework/yiic webapp MyTest

然后转到/protected/views/layouts/main.php,将页脚更改为带有utf8字符的文本,例如

<div id="footer">
        Cópyrîgth <br />
</div>

刷新页面,一切正常。好的! ;)

然后我尝试使用用户名中的 utf8 字符登录,例如 áadmin,它崩溃说:

Error 500

htmlspecialchars(): Invalid multibyte sequence in argument

所以我查看了这篇关于unicode in yii的文章

然后我去了 /protected/config/main.php 并在开头添加了这一行:

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

再次重试相同的登录它可以工作(不会崩溃)但现在页脚已损坏并显示:

C�pyr�ght

我尝试了其他组合,如“yii 中的 Unicode”一文中所述,但它们都不能同时工作。

有解决这个问题的想法吗?

注意:我无法更改为 php.ini 文件。

我还尝试了 .htaccess 文件中的 AddDefaultCharset UTF-8 选项,并将其放在 /MyTest/ 的文件夹中,文章中提到的正确文件夹为:您的 文档根 ?

谢谢

【问题讨论】:

  • 我遇到了同样的问题。你找到解决方案了吗?
  • 那些问号是无效 UTF-8 字节序列的结果。很可能您正在使用以单字节编码保存文本的编辑器,例如ISO 8859-1。在所有作为 ASCII 扩展的单字节编码中,扩展部分的字节值 >= 128。UTF-8 的所有单字节字符均 = 128 的字节组成。这就是为什么带有变音符号的 ISO 8859-x 字符变成了问号:它们永远不可能是有效的 UTF-8,除非是不太可能的组合。

标签: php html utf-8 character-encoding yii


【解决方案1】:

我对 yii 一点也不熟悉,但是,如果您想将文字 unicode 字符粘贴到文件中,您需要确保您的文本编辑器使用 unicode 编码(例如 utf8)保存文件。试试 utf8,没有 BOM。

我的经验是,当您更改编码设置并且其中已经存在编码字符时,文本编辑器的行为会很奇怪。只需从一个新文件重新开始,更改编码,然后将字符粘贴进去。

【讨论】:

  • “使用 unicode 编码,例如 utf8”不是一个好建议,应该是“使用 UTF-8 Unicode 编码”。不建议将其他Unicode 编码用于网络。而BOM(字节顺序标记)在 UTF-8 中几乎没有意义,大多数编辑者甚至不考虑 UTF-8 的这个选项(正确地)。
  • 我必须纠正自己:显然,甚至有一个编辑器的示例能够保存 UTF-8 编码文件没有一个 BOM:微软的记事本。不想使用 IDE 编辑器的 Windows 用户仍然可以使用 Notepad++,它是免费的并且非常用户友好。
【解决方案2】:

首先,您应该删除 main.php 文件中的标头调用,它可能会在将来给您带来问题。

其次,我会按照 rambo coder 的建议进行操作,并确保您的文件在编辑器中保存为 UTF8。

【讨论】:

    【解决方案3】:

    上述解决方案似乎是正确的方法,因为 Yii 确实没有 unicode 问题,但您也可以执行一些额外的检查,例如 Html 页面中元标记中的字符集设置为 utf-8 而不是写纯 html,您可以使用 Chtml::encode(Copyright) 以便 yii 处理编码。对于用户名部分,请确保数据库中的默认字符集也设置为 utf8。

    【讨论】:

      【解决方案4】:

      对于htmlspecialchars 问题,请检查此答案:https://stackoverflow.com/a/3803972/133408

      您必须将编码指定为htmlspecialchars 的第三个参数

      【讨论】:

        【解决方案5】:

        解决此问题的最佳方法是使用http://www.utexas.edu/learn/html/spchar.html - 在您的情况下 Cópyrîght 将显示为 C&amp;#243;pyr&amp;#238;ght

        另外,我将添加 HTML &lt;meta charset="utf-8"&gt; 以确保浏览器正常运行。

        【讨论】:

        • 无疑是最好的方法,在正确设置 utf 系统中,无需将字符编码为 html 实体。
        • 不值得一票否决,因为虽然技术上不正确,但我很高兴知道这是一个选项。
        • "best way AROUND this" 表示绕过所有 UTF8 复杂性,尤其是。当使用多字节字符并看到具有不同字体集的用户代理(浏览器)显示时为 true。
        【解决方案6】:

        首先,您需要了解带有 ó 或 î 之类的变音符号(来自您的示例)的字符不会自动成为“utf-8 字符”。它只是一个在不同字符集中具有不同编码(如果有)的字符,即使在那些具有共同基本单字节 ASCII 部分的字符集中(即英文字母、数字、最常见的标点符号和还有几个)。您可以将其称为“有问题的字符”,但不能称为“utf-8 字符”。

        因此,当您编写页脚&lt;div&gt; 时,您并没有将其编写为 UTF-8 编码。您的编辑器将这些字符保存为单字节编码,例如 ISO 8859-1 或其亲属之一。

        如果未指定,浏览器通常会自动检测页面中使用的编码。这就是为什么您最初能够在浏览器中准确地看到您在编辑器中编写的内容。

        然后您尝试使用用户名中的“有问题的字符”登录。浏览器将您的页面解释为具有单字节编码,因此这导致它以相同的方式对您的表单输入进行编码,并将其以单字节编码发送回服务器。显然,编写 PHP 代码时没有考虑到这种可能性,因为它没有正确设置 htmlspecialchars() 的第三个参数,默认为 "UTF-8"(从 PHP 5.4.0 开始 - 之前是 "ISO-8859-1" )。由于带有“有问题的字符”的单字节编码字符串几乎从来都不是有效的 UTF-8 字符串(请参阅我对您的问题的评论,这是第二条评论),htmlspecialchars() 拒绝了它。

        然后您正确添加了header('Content-Type: text/html; charset=utf-8');,它禁用了浏览器的自动字符集检测。此时很明显,您的带有页脚 &lt;div&gt; 的文件不是 UTF-8 编码的(请再次查看我的评论以了解出现的问号而不是“有问题的字符”)。

        因此,您剩下要做的就是说服您的编辑器保存 UTF-8 编码的文件。正如其他人所指出的,以不同的编码保存文件并不适用于所有编辑器。从新文件开始有时是解决方案,可能是在将编辑器的默认编码设置为 UTF-8 之后。

        要检查编码,您可以在 shell 中使用file 命令。它的输出应该类似于

        main.php: PHP script, UTF-8 Unicode text
        

        或者,您可以使用od -tx1z 命令将您的文件(可能是| less)转储为十六进制字节序列,并在旁边显示相应的字符串。如果文件是单字节编码的,那么您的“有问题的字符”将是单字节 >= 0x80。如果是 UTF-8 编码,它们将是 2 个字节的序列(其他将是 3 个或更多字节),全部 >= 0x80,而“非问题字符”将继续是单个字节

        你说的文章写的不错,照着看吧。

        你不需要AddDefaultCharset 文件中的AddDefaultCharset 指令,但是,如果你所有的页面都是用Content-Type: text/html; charset=utf-8 HTTP 头生成的,因为 Apache 指令的效果是完全一样的(而且它最好在 PHP 中保持对编码的控制)。

        对于浏览器,添加&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"/&gt; 与上面的HTTP 标头具有相同的效果(注意http-equiv)。 HTTP 标头更清晰,但如果保存的页面没有标头信息,此附加元标记可能会有所帮助。

        最重要的是,不要害怕UTF-8,因为它是你的朋友!

        (...但是,从获得您赏金的答案中,我看到您和许多人一样,继续认为理解字符编码对您来说太难了☹)

        【讨论】:

        • +10 表示综合答案和结尾悲伤的表情,在 utf 中
        【解决方案7】:

        我也遇到过这个问题——特别是当我试图从 db.xml 显示 utf 文本时。 我将 mysql 中的所有排序规则和类型更改为 utf8-bin - 但仍然没有爱...然后我尝试使用元标记等更改我所有的布局和视图...地狱,我什至查看了日本网站的源代码并将这些东西粘贴到...没有工作_...直到...我遇到了这篇文章:Yii And UTF8 Display, UTF8 works with mysqli but not yii backend 结果,您需要在配置文件中的 main.php 中的组件下设置一个设置.. f

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-10-03
          • 2013-02-07
          • 1970-01-01
          • 1970-01-01
          • 2015-03-07
          • 1970-01-01
          • 2020-06-01
          相关资源
          最近更新 更多