首页
学习
活动
专区
圈层
工具
发布

UTF-8全程
EN

Stack Overflow用户
提问于 2008-11-11 05:04:57
回答 16查看 177.6K关注 0票数 1.3K

我正在设置一个新的服务器,并希望在我的web应用程序中完全支持UTF-8。我过去在现有的服务器上尝试过这种方法,似乎总是不得不回到ISO-8859-1。

我到底需要在哪里设置编码/字符集?我知道我需要配置Apache、MySQL和PHP才能做到这一点--有没有一些标准的检查表可以让我遵循,或者在哪里出现不匹配的地方进行故障排除?

这是一个新的运行MySQL 5、PHP5和Apache2的服务器。

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2008-11-11 05:43:05

数据存储

  • 在数据库中的所有表和文本列上指定utf8mb4字符集。这使得MySQL可以物理地存储和检索以UTF-8原生编码的值。请注意,如果指定了utf8mb4排序规则(没有任何显式字符集),则MySQL将隐式使用utf8mb4_*编码。

  • 在旧版本的MySQL (< 5.5.3)中,不幸的是,您将被迫简单地使用utf8,它只支持Unicode字符的子集。我希望我是在开玩笑。

数据访问

  • 在你的应用程序代码中(例如PHP),无论你使用哪种数据库访问方法,你都需要将连接字符集设置为utf8mb4。这样,当MySQL将数据传递给您的应用程序时,它不会从原生UTF-8进行转换,反之亦然。

  • 某些驱动程序提供了自己的机制来配置连接字符集,该机制既更新自己的内部状态,又通知MySQL要在连接上使用的编码-这通常是首选方法。在PHP中:

代码语言:javascript
复制
- If you're using the [PDO](http://www.php.net/manual/en/book.pdo.php) abstraction layer with PHP ≥ 5.3.6, you can specify `charset` in the [DSN](http://php.net/manual/en/ref.pdo-mysql.connection.php):

$dbh =新PDO('mysql:charset=utf8mb4');

代码语言:javascript
复制
- If you're using [mysqli](http://www.php.net/manual/en/book.mysqli.php), you can call [`set_charset()`](http://php.net/manual/en/mysqli.set-charset.php):

$mysqli->set_charset('utf8mb4');//面向对象风格mysqli_set_charset($link,'utf8mb4');//过程式风格

代码语言:javascript
复制
- If you're stuck with plain [mysql](http://php.net/manual/en/book.mysql.php) but happen to be running PHP ≥ 5.2.3, you can call [`mysql_set_charset`](http://php.net/manual/en/function.mysql-set-charset.php).

如果驱动程序没有提供自己的设置连接字符集的机制,则可能必须发出一个查询来告诉MySQL应用程序期望如何编码连接上的数据:

  • 有关utf8mb4/utf8的同样注意事项也适用于上述情况。

输出

  • 如果您的应用程序将文本传输到其他系统,则还需要通知它们字符编码。对于web应用程序,必须通知浏览器发送数据所使用的编码(通过HTTP响应头或HTML metadata).

  • 在PHP中,您可以使用default_charset php.ini选项,或者自己手动发出Content-Type MIME标头,这只是工作量较多,但效果相同。

  • 使用json_encode()对输出进行编码时,添加JSON_UNESCAPED_UNICODE作为第二个参数。

输入

在尝试存储或在任何地方使用之前,应验证每个接收到的字符串是否为有效的

  • Unfortunately,-8。PHP的mb_check_encoding()可以做到这一点,但你必须忠实地使用它。这真的是无计可施,因为恶意客户端可以提交他们想要的任何编码的数据,而且我还没有找到让PHP为你可靠地做到这一点的诀窍。

从我对当前HTML spec的阅读来看,下面的子项目符号对于现代不再是必要的,甚至不再有效。我的理解是,浏览器将使用为文档指定的字符集并提交数据。但是,如果您的目标是旧版本的超文本标记语言(XHTML、HTML4等),这些要点可能仍然有用:

代码语言:javascript
复制
- _For HTML before HTML5 only_: you want all data sent to you by browsers to be in UTF-8.  Unfortunately, if you go by the only way to reliably do this is add the `accept-charset` attribute to all your `<form>` tags: `<form ... accept-charset="UTF-8">`.
- _For HTML before HTML5 only_: note that the W3C HTML spec says that clients "should" default to sending forms back to the server in whatever charset the server served, but this is apparently only a recommendation, hence the need for being explicit on every single `<form>` tag.

其他代码注意事项

  • 显然足够了,你要服务的所有文件(PHP、HTML、JavaScript等)应使用有效的UTF-8编码。

  • 您需要确保每次处理UTF-8字符串时都是安全的。不幸的是,这是最难的部分。您可能想要广泛使用PHP的mbstring扩展。

  • PHP's内置的字符串操作是而不是默认的UTF-8安全。有一些事情你可以安全地使用普通的PHP字符串操作(如连接),但对于大多数事情,你应该使用等效的mbstring函数。

  • 要知道你在做什么(阅读:不搞砸),你真的需要知道UTF-8以及它是如何在尽可能低的级别上工作的。查看utf8.com上的任何链接,获得一些很好的资源,以了解您需要了解的一切。
票数 1.1K
EN

Stack Overflow用户

发布于 2008-11-12 19:27:01

我想向chazomaticus' excellent answer添加一件事

也不要忘记META标签(像这样,或者the HTML4 or XHTML version of it):

代码语言:javascript
复制
<meta charset="utf-8">

这看起来微不足道,但IE7以前就给过我一些问题。

我做的一切都是对的;数据库、数据库连接和Content-Type HTTP头都设置为UTF-8,并且它在所有其他浏览器中都工作得很好,但是Internet Explorer仍然坚持使用“西欧”编码。

结果发现页面缺少META标签。加上这一点就解决了问题。

编辑:

W3C实际上有一个相当大的section dedicated to I18N。他们有许多关于这个问题的文章-描述HTTP,(X)HTML和CSS方面的东西:

  • FAQ: Changing (X)HTML page encoding to UTF-8
  • Declaring character encodings in HTML
  • Tutorial: Character sets & encodings in XHTML, HTML and CSS
  • Setting the HTTP charset parameter

他们建议同时使用HTTP标头和HTML meta标记(如果将XHTML用作XML,则使用XML声明)。

票数 160
EN

Stack Overflow用户

发布于 2008-11-10 21:30:36

除了在php.ini中设置default_charset之外,您还可以在任何输出之前使用header()从代码中发送正确的字符集:

代码语言:javascript
复制
header('Content-Type: text/html; charset=utf-8');

只要您意识到大多数字符串函数不能与Unicode一起使用,并且有些函数可能完全用处理字符串,那么在PHP中使用Unicode是很容易的。PHP将"characters“视为1字节长。有时这是可以的(例如,explode()只查找字节序列并将其用作分隔符--因此您查找的实际字符并不重要)。但在其他情况下,当函数实际上设计为处理字符时,PHP不知道您的文本包含Unicode中的多字节字符。

phputf8是一个很好的签入库。这将重写所有的“坏”函数,因此您可以安全地处理UTF8字符串。也有像mbstring扩展这样的扩展可以帮你做到这一点,但我更喜欢使用这个库,因为它更便于移植(但我写的是大众市场的产品,所以这对我来说很重要)。但无论如何,phputf8可以在幕后使用mbstring来提高性能。

票数 67
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/279170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档