栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

我在我的PHP应用程序中正确支持UTF-8吗?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

我在我的PHP应用程序中正确支持UTF-8吗?

页面加载时,是否需要将我从用户代理收到的所有内容(HTML表单和URI)转换为UTF-8?

否。用户代理应该以UTF-8格式提交数据;否则,您将失去Unipre的优势。

确保用户代理以UTF-8格式提交的方法是提供包含以UTF-8编码提交的表单的页面。使用Content-
Type标头(如果要保存表单并独立工作,也可以使用meta http-equiv)。

我听说您也应该将表单标记为UTF-8(accept-charset =“ UTF-8”)

别。
在HTML标准中,这是一个不错的主意,但是IE却没有做到这一点。本来应该声明允许的字符集的排他性列表,但是IE将其视为按字段尝试的其他字符集的列表。因此,如果您有ISO-8859-1页面和“
accept-charset =“ UTF-8””表单,则IE首先会尝试将字段编码为ISO-8859-1,如果非8859-1字符, 然后
使用UTF-8。

但是由于IE不会告诉您它是否使用过ISO-8859-1或UTF-8,因此这绝对对您没有用。您将不得不分别针对每个字段猜测正在使用哪种编码!没用。忽略该属性,并将您的页面作为UTF-8服务;这是您目前可以做的最好的事情。

如果UTF字符串编码不正确,将会出问题

如果让这样的顺序进入浏览器,您可能会遇到麻烦。有些“超长序列”会以比所需长度更长的字节序列来编码低编号的代码点。这意味着,如果要通过按字节顺序查找ASCII字符来过滤“
<”,则可能会漏掉一个,并将脚本元素放入您认为是安全的文本中。

在Unipre成立之初,就禁止使用过长的序列,但是微软花了很长时间才把它们弄得一团糟:IE直到IE6 Service Pack 1才将字节序列’ xC0
xBC’解释为’<’。
Opera甚至在版本7上也弄错了。幸运的是,这些较旧的浏览器正在逐渐消失,但是仍然值得过滤掉冗长的序列,以防那些浏览器仍然存在(或者新的白痴浏览器将来会犯同样的错误)
)。你可以这样做,并修复等不良序列,用正则表达式只允许适当的UTF-8通过,比如这一个从W3。

如果在PHP中使用mb_函数,则 可能 会遇到这些问题。我不能肯定地说,因为当我还在写PHP时mb_ *是不可用的脆弱。

无论如何,这也是删除控制字符的好时机,控制字符是大量的错误源,通常是不被重视的。除了W3正则表达式删除的其他字符外,我还将从提交的字符串中删除字符9和13。对于您不应该将其视为多行文本框的字符串,也可以删除普通的换行符。

是否编写了UTF-16以解决UTF-8中的限制?

不,UTF-16是每代码点两个字节的编码,用于使索引Unipre字符串在内存中更容易(从所有Unipre都可以容纳两个字节的时代开始;像Windows和Java这样的系统仍然可以这样做)。与UTF-8不同,它与ASCII不兼容,并且在Web上几乎没有用。但是您有时会在保存的文件中遇到它,通常是Windows用户保存的文件,这些文件被Windows在另存为菜单中将UTF-16LE描述为“
Unipre”而误导了。

seen_utf8

与正则表达式相比,这是非常低效的!

另外,请确保在所有表上使用utf8_unipre_ci。

实际上,您可以在这种情况下摆脱困境,将MySQL视为只存储字节的存储,而在脚本中仅将它们解释为UTF-8。使用utf8_unipre_ci的优点是它将使用有关非ASCII字符的知识来整理(排序并进行不区分大小写的比较)。“ŕ”和“Ŕ”是相同的字符。如果使用非UTF8归类,则应坚持二进制(区分大小写)匹配。

无论您选择哪种方式,都必须始终如一地进行操作:对表使用与连接相同的字符集。您要避免的是脚本和数据库之间的有损字符集转换。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452151.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号