繁体   English   中英

在yii中使用utf8字符和htmlspecialchars时出错

[英]Error with utf8 characters and htmlspecialchars in yii

我在yii中遇到char编码问题。 如果我创建一个新的webapp:

 ./Yii-framework/framework/yiic webapp MyTest

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

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

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

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

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

谢谢

我对yii并不熟悉,但是,如果要将文字unicode字符粘贴到文件中,则需要确保文本编辑器使用unicode编码保存文件,例如utf8。 尝试utf8,没有BOM。

我的经验是,当您更改编码设置并且其中已经编码了字符时,文本编辑器会表现得很奇怪。 重新开始使用新文件,更改编码,然后粘贴字符。

首先,您需要了解具有变音符号(如您的示例)的字符不会自动成为“utf-8字符”。 它只是一个在不同字符集中具有不同编码(如果有的话)的字符,即使在那些具有基本单字节ASCII部分的字符集中(即英文字母,数字,最常见的标点符号,以及再多一点)。 你可以称之为“有问题的角色”,但不是“utf-8角色”。

所以,当你编写你的页脚<div> ,你没有把它写成UTF-8编码。 您的编辑器以单字节编码保存这些字符,如ISO 8859-1或其亲属之一。

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

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

然后你正确添加了header('Content-Type: text/html; charset=utf-8'); ,禁用浏览器自动charset检测。 此时很明显,带有页脚<div>文件不是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,而“无问题字符”将继续是单个字节<0x80。

您提到的文章似乎写得很好,只需遵循它。

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

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

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

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

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

其次,我会做rambo编码器建议的,并确保您的文件在编辑器中保存为UTF8。

上面的解决方案似乎是正确的方式,因为Yii确实没有unicodes的问题,但你也可以执行一些额外的检查,如你的Html页面中元标记内的charset设置为utf-8而不是写简单的HTML你可以使用Chtml :: encode(版权),以便yii处理编码。 对于用户名部分,请确保数据库中的Default Charset也设置为utf8。

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

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

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

此外,我将添加HTML <meta charset="utf-8">以确保浏览器自己的行为。

我也有这个问题 - 特别是当我试图从db显示utf文本时。 我将mysql中的所有colations和类型更改为utf8-bin - 但仍然没有爱...然后我尝试使用meta标签等我的所有布局和视图...地狱,我甚至看了日本网站的源代码并且粘贴了那些东西......没有工作_ ...直到...我遇到了这个帖子: Yii和UTF8显示,UTF8与mysqli一起使用但不是yii后端结果,你需要在我的主要调整设置。配置文件中的php,在components ..下

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM