码迷,mamicode.com
首页 > 其他好文 > 详细

UTF-8一路通过

时间:2019-10-21 13:38:42      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:回退   字符集   com   情况   xhtml   open   lan   php字符串   关于   

我正在建立一个新的服务器,并希望在我的web应用程序中完全支持UTF-8。过去,我在现有的服务器上尝试过,似乎最终不得不回退到ISO-8859-1。

我到底需要设置编码/字符集?我知道我需要配置Apache,MySQL和PHP来做到这一点 -
是否有我可以遵循的标准清单,或者可能排除不匹配发生的地方的疑难解答?

这是一个新的Linux服务器,运行MySQL 5,PHP 5和Apache 2。

数据存储**:

  • 在数据库的所有表和文本列上指定utf8mb4字符集。这使MySQL实际存储和检索UTF-8本地编码的值。请注意,如果指定了utf8mb4 _ *排序规则(没有任何明确的字符集),MySQL将默认使用utf8mb4编码。

在旧版本的MySQL(< 5.5.3)中,不幸的是你不得不使用简单的utf8,它只支持Unicode字符的一个子集。我希望我在开玩笑。

数据存取

  • 在您的应用程序代码(例如PHP)中,无论您使用哪种数据库访问方法,都需要将连接字符集设置为utf8mb4。通过这种方式,MySQL在将数据传递到应用程序时不会转换为原生UTF-8,反之亦然。
    一些驱动程序提供了自己的配置连接字符集的机制,它们都会更新自己的内部状态,并通知MySQL将在连接上使用的编码 - 这通常是首选的方法。在PHP中:

* 如果您使用[ mysqli ](http://www.php.net/manual/en/book.mysqli.php),则可以请致电[ ` set_charset()` ](http://php.net/manual/en/mysqli.set-charset.php):

<预> <代码> $ mysqli-&GT; set_charset( ‘utf8mb4’); //面向对象的风格 mysqli_set_charset($
link,’utf8mb4’); //程序风格

* 如果您遇到简单的[ mysql ](http://php.net/manual/en/book.mysql.php),但碰巧运行PHP≥5.2.3时,可以调用[ ` mysql_set_charset <代码> ](http://php.net/manual/en/function.mysql-set-charset.php)。
  • 如果驱动程序没有提供自己的连接字符集设置机制,那么您可能需要发出一个查询来告诉MySQL您的应用程序期望连接上的数据是如何被编码的: SET NAMES'utf8mb4'

  • 关于utf8mb4 / utf8的同样的考虑也适用于上面。

<强>输出:

  • 如果您的应用程序将文本传输到其他系统,则还需要通知字符编码。使用Web应用程序时,必须通知浏览器发送数据的编码(通过HTTP响应标头或 HTML元数据)。< / p>
  • 在PHP中,您可以使用 default_charset php.ini选项,或自己手动发布Content-Type MIME头,这只是更多的工作,但效果相同。

<强>输入:

  • 不幸的是,在尝试存储或在任何地方使用它之前,您应该验证每个接收的字符串是否为有效的UTF-8。 PHP的 mb_check_encoding() 诀窍,但你必须虔诚地使用它。真的没有办法解决这个问 大专栏  UTF-8一路通过题,因为恶意的客户端可以用任何他们想要的编码来提交数据,而且我还没有找到让PHP能够为你做到这一点的技巧。

  • 在阅读当前的 HTML规范之后,下面的子项是不必要的,甚至是不必要的现代的HTML有效。我的理解是,浏览器将使用为文档指定的字符集提交数据。但是,如果您定位的是旧版本的HTML(XHTML,HTML4等),这些点可能仍然有用:

    • 仅适用于HTML5之前的HTML :您希望浏览器向您发送的所有数据都是UTF-8。不幸的是,如果你唯一可以做到的方法是将accept-charset属性添加到所有的&lt; form&gt;标签中:&lt; form ... accept-charset =“UTF-8”&gt;
      注意,W3C的HTML规范指出,客户端“应该”默认发送表单回到服务器,无论服务器在哪个字符集中,但这显然只是一个建议,因此需要在每一个&lt; form&gt;标签上进行显式化。

其他代码注意事项

很明显,所有你要服务的文件(PHP,HTML,JavaScript等)都应该用有效的UTF-8编码。

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

PHP的内置字符串操作默认情况下不是默认的UTF-8。**在普通的PHP字符串操作中可以安全地执行一些操作(比如串联),但对于大多数情况,您应该使用等效的mbstring函数。

要知道你在做什么(阅读:不要搞砸了),你真的需要知道UTF-8,以及它如何在尽可能低的水平上工作。查看 utf8.com中的任何链接,获取一些有用的资源,以了解您需要了解的所有信息。

我想在[ chazomaticus的优秀答案中添加一项内容

一个>:

不要忘记META标签(像这样,或者 HTML4或XHTML版本):

<meta charset="utf-8">

这似乎微不足道,但IE7给了我以前的问题。

我一切正常。数据库,数据库连接和Content-Type HTTP头都设置为UTF-8,并且在所有其他浏览器中都能正常工作,但Internet
Explorer仍然坚持使用“西欧”编码。

事实证明,该页面缺少META标签。添加解决了这个问题。

**修改

W3C实际上有一个相当大的专用于I18N的部分。他们有许多与这个问题有关的文章 -
描述HTTP,(X)HTML和CSS方面:

他们建议同时使用HTTP标头和HTML元标记(或者在XHTML作为XML的情况下使用XML声明)。

未经作者同意,本文严禁转载,违者必究!

UTF-8一路通过

标签:回退   字符集   com   情况   xhtml   open   lan   php字符串   关于   

原文地址:https://www.cnblogs.com/sanxiandoupi/p/11712854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!