PHP5中处理Unicode的指南?

10

大家好,我正在开发一个新网站(php5/mySQL),并希望最终加入Unicode阵营。目前我对支持Unicode几乎一无所知,但我希望在你们的帮助下解决这个问题。

在疯狂使用谷歌搜索和仔细查看所有看起来有希望的Unicode入门页面后,我得出结论:尽管不是完全支持,但我珍爱的编程语言(PHP,如果有人忘记了)至少已经试图应对这个外来的难题(而且从其他信息中看,似乎成功了?)。我还得出了这样的结论:

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

我发现stackoverflow是一个很好的开始之地,并且因为我在(共享的)主机上有足够的空间,所以应该考虑支持UTF-8编码。

然而,我不确定 mb_* 这种奇怪的功能是什么意思,也不知道如何将其整合到像 strlen() 这样的函数中……说实话,我目前不知道还有哪些其他功能(我不能没有)会受到影响。

因此,在Unicode方面让我感到困惑时,我来到了StackOverflow,寻求启示和可能澄清的帮助。我真的很想支持它,但我需要认真的帮助。

附:Unicode是否影响 mysql_real_escape_string() 或任何其他防止 XSS 的安全措施?我也需要了解这个!

提前感谢。

  • 我会加入JavaScript,因为我将使用纯js和jQuery的混合,而不知道Unicode支持+此语言的情况。;)

1
+1 鼓励提出那些很少有人问的问题。Unicode 是每个程序员都应该了解的内容。 - Thanatos
更不用说PHP和Unicode并不是非常直观的。 - GWW
我的错。我评论的目的是认为支持 Unicode 最重要的事情是理解我列出的内容,而不是 PHP 中支持 Unicode 的特定细节。 - goat
没关系,我理解你说的话的意思和原因,并且很感激。然而,如果我不知道如何正确处理主要语言的支持,PHP的“缺陷”就会非常严重。这就是为什么我希望有人能够回答更多的信息,例如是否通过支持来牺牲更少/更多的安全性,哪些“正常”的PHP内置函数需要被“更改”,以及像etranger提到的“UTF-8 without BOM”(我不知道)。 :) - Zydeco
这只是你知识上的暂时缺陷,而不是 PHP 的错误。其他编程语言也不能像我们生活在 ASCII 世界一样神奇地使 Unicode 正常工作。这里已经有很多错误的答案了...祝好运。 - goat
显示剩余3条评论
3个回答

5
  1. 欢迎加入utf8船员团队 :)
  2. 您应该简单地使用mb_*函数,替换传统的str*函数。
  3. MySQL及其API长期以来一直支持utf8,唯一的要求是在保存数据和连接时使用正确的编码。请搜索“SET NAMES utf8”。
  4. 请注意preg_*函数的'u'修饰符,它告诉它们使用unicode模式。

2
请注意,您的源代码文件应该是utf8 WITHOUT BOM格式,因为它会在PHP开始之前输出并导致非常奇怪的“Headers already sent”问题。 - Dennis Kreminsky
  1. 非常感谢,我很高兴来到这里。 :)
  2. 有没有“速查表”类型的地方列出它们的清单,或者展示如何使用它们的地方?(PHP手册,嗯,基本上让我迷失了)。
  3. 我至少找到了这么多,并且知道如何存储在UTF-8中。
  4. '/u',对吧?
  5. 我使用Wine中的Notepad++,所以为了回复你的回复,我选择“UTF-8无BOM”,这应该解决源代码文件的问题吧? - 另外,非常抱歉我的回复比较混乱。我在回复方面有点新手,不知道是否有换行的方式,因为按Enter键似乎会将我的评论发送出去。
- Zydeco
嗯,所以mb_*是任何字节(或字符)特定函数的替代品,因为它支持多字节字符(Unicode!),对吧?这让我对安全性产生了疑问,是否有任何变化,比如mysql_real_escape_string()(可能没有),或者htmlentities()(有吗?)。当然,如果还有其他我不知道需要了解的内容,请告诉我。 - Zydeco
你对于 mb_* 是正确的;mb 代表 multibyte 字符串扩展。mysql_real_escape_string() 使用与数据库连接相同的编码,所以只要您连接为 utf8,就很安全。至于 htmlentities,无法确认其可靠性,因为它在 Cyrillic 字符上存在问题(这也是我首先使用 utf8 的原因)。 - Dennis Kreminsky
没有什么特别的jQuery,唯一让我感到困扰的是php的json_encode()如何处理非ASCII字符,将它们转换为\uXXXX表示法,这不太好。 这会影响JSON,但不直接影响JavaScript。 - Dennis Kreminsky
显示剩余5条评论


-1

在处理 Unicode 时:

  • 输出页面时,在页面顶部使用<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
  • 连接数据库后,立即使用以下 SQL 查询:mysql_query("set names 'utf8'");
  • 确保所有表和必需的字段都具有字符集类型:'utf8_unicode_ci'

我原本认为正确的文档类型和HTML标签的组合比meta标签更有效。有人能为我澄清一下吗?至于连接数据库,我认为如果页面本身编码为UTF-8并且数据库也是UTF-8编码,那么就不会有问题了吧? - Zydeco
我使用了上述组合使事情正常工作。我还发现'mysql_query("set names 'utf8'")'是必要的。至于正确的doctype与meta问题,请咨询专家。 - Imran Omar Bukhsh
我不知道是谁做的,但不是我。 - Zydeco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接