5

我在 yii 中的 char 编码有问题。如果我创建一个新的 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

所以我检查了这篇关于yii 中的 unicode 的文章

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

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

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

C�pyr�ght

我已经尝试过其他组合,如“yii 中的 Unicode”文章中解释的那样,但它们都不能同时工作。

解决这个问题的任何想法?

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

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

谢谢

4

7 回答 7

6

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

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

于 2012-06-11T22:12:04.383 回答
4

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

所以,当你写你的 footer 时<div>,你并没有把它写成 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');,它禁用了浏览器的自动字符集检测。在这一点上,很明显您的带有页脚的文件<div>不是 UTF-8 编码的(再次查看我的评论以解释出现的问号而不是“有问题的字符”)。

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

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

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

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

您提到的文章似乎写得很好,请按照它。

但是,如果您的所有页面都是使用 HTTP 标头生成的,则不需要文件AddDefaultCharset中的指令,因为 Apache 指令的效果完全相同(并且最好在 PHP 中保持对编码的控制)。.htaccessContent-Type: text/html; charset=utf-8

对于浏览器,添加<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>与上面的 HTTP 标头具有相同的效果(注意 http- equiv)。HTTP 标头更清晰,但是这个额外的元标记可能有助于在没有标头信息的情况下保存页面。

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

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

于 2013-03-21T22:27:33.053 回答
2

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

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

于 2012-06-13T13:15:22.433 回答
1

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

于 2013-03-15T20:31:18.060 回答
1

对于htmlspecialchars问题检查这个答案:https ://stackoverflow.com/a/3803972/133408

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

于 2013-03-20T16:31:05.383 回答
0

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

此外,我将添加 HTML<meta charset="utf-8">以确保浏览器能够正常运行。

于 2013-03-21T05:58:04.993 回答
0

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

于 2014-03-07T09:28:54.703 回答