错误与警予UTF8字符并用htmlspecialchars(Error with utf8 char

2019-06-25 09:52发布

我有一个在警予炭编码的问题。 如果我创建一个新的Web应用程序:

 ./Yii-framework/framework/yiic webapp MyTest

然后去/protected/views/layouts/main.php并与UTF8字符改变页脚文本,例如

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

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

然后我尝试在用户名的utf8字符登录,例如管理员 ,它崩溃说:

Error 500

htmlspecialchars(): Invalid multibyte sequence in argument

所以,我检查了这篇关于在警予的unicode

然后我去/protected/config/main.php,并将此行的开头:

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

重试相同的登录一次它的工作原理(不崩溃),但现在页脚被打破,并显示:

C�pyr�ght

我尝试过其他组合一样,在“统一的警予”的文章解释,但他们没有做的事情都在同时工作。

任何想法解决这个问题?

注:我不能改变的php.ini文件。

我也试过在.htaccess文件AddDefaultCharset UTF-8选项,并把它的文件夹中的/ MyTest的/是正确的文件夹中的文章中提到:你的DocumentRoot?

谢谢

Answer 1:

我不是在所有熟悉警予,但是,如果你想字面Unicode字符粘贴到一个文件,你需要确保你的文本编辑器使用Unicode编码,如UTF8保存文件。 尝试UTF8,没有一个BOM。

我的经验是,当你更改编码设置,但在它的已编码字符的文本编辑器的行为奇怪。 以全新的文件重新开始,改变编码,然后粘贴字符。



Answer 2:

首先,你要明白,与像0或1(从你的例子)一个变音符号的字符是未进行自动“UTF-8字符”。 这仅仅是具有不同编码的字符(如果有的话)在不同的字符集,即使在有共同的(即英文字母,数字,最常用的标点符号,以及基本的单字节的ASCII部分的字符集几个)。 你可以称之为一个“问题人物”,而不是“UTF-8字符”。

所以,当你写你的页脚<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的。

你提到的文章似乎写得很好,只是跟着它。

你不需要AddDefaultCharset指令中.htaccess文件,不过,如果您的所有网页都与生成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- 当量 )。 HTTP标头是清洁的,但这种附加的meta标签可能的情况下,一个页面保存没有标题的信息帮助。

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

(......但是,从有你的赏金答案,我发现你和很多人一样,继续思考,理解字符编码是太为难你☹)



Answer 3:

首先,你应该删除在main.php文件头调用,这也许可以在未来为你的问题。

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



Answer 4:

上述解决方案似乎是因为Yii中并没有真正有统一码一个问题的正确方法,但你也可以执行像在你的HTML页面的元标记中的字符集设置为UTF-8,而不是给你写纯HTML的一些额外的检查可以使用的cHTML ::编码(版权),以便警予将处理的编码。 对于用户名部分,确保在你的数据库的默认字符集也设置为UTF-8。



Answer 5:

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

你必须指定编码为第三个参数htmlspecialchars



Answer 6:

解决这个问题的最好方法是使用http://www.utexas.edu/learn/html/spchar.html -你的情况版权将显示为C&#243;pyr&#238;ght

另外,我将添加在HTML <meta charset="utf-8">以确保浏览器表现自己。



Answer 7:

我有这个问题太 - 特别是当我试图显示从分贝UTF文本。 我改变了所有的colations和类型在MySQL为utf8斌 - 但仍然没有爱......然后我试图chnage我所有的布局和视图与meta标签等...见鬼,我甚至看日本网站源代码并粘贴在...没有什么东西保护正常工作_ ...到...我碰到此帖一: Yii的而UTF8显示,UTF8可与库MySQLi而不是警予后端原来,你需要tweek在我的主要的设置。 PHP在配置文件中,下部件..˚F



文章来源: Error with utf8 characters and htmlspecialchars in yii