[英]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
然后我去了/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ópyrî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.