数字语言,无论是英语、日语还是其他任何语言,都由许多字符组成。因此,在数字处理语言时,一个基本问题是如何以数字方式表示每个字符。过去,我们只需要表示英语字符,但如今情况大不相同,结果是出现了令人眼花缭乱的字符编码方案来表示多种不同语言的字符。PHP 如何与这些不同的方案相关联并处理它们?
要点
基础知识
我们都知道,“位”可以是 0 或 1,而“字节”是八个连续位的组合。由于一个字节中有八个这样的双值位,因此一个字节可以配置成总共 256 种不同的模式(2 的 8 次方)。可以将不同的字符与每种可能的 8 位模式关联起来。将这些字节按不同的顺序组合在一起,您就拥有了自己的通信方式。它不一定是智能的,这取决于两端是谁,但它是通信。只要我们可以用 256 个或更少的唯一字符表达一种语言的字符,我们就成功了。但是,如果我们不能只用 256 个字符来表达一种语言呢?或者如果我们需要在同一个文档中表达多种语言呢?今天,随着我们对所有可以找到的东西进行数字化处理,256 个字符远远不够。幸运的是,已经设计出了更能应对这一挑战的字符方案。这些新的超级字符集使用一到四个字节来定义字符。如今字符编码领域的大佬是 Unicode,这是一种使用多个字节表示字符的方案。它由 Unicode Consortium 开发,并且有几个版本:UTF-32(用于 Dreadnaught 级星舰)、UTF-16(用于《星际迷航:暗黑无界》中的企业号)和 UTF-8(我们大多数人在现实世界中应该为我们的 Web 应用程序使用)。正如我所说,Unicode(包括 UTF-8)使用多个字节配置来表示字符。UTF-8 使用一到四个字节来生成 1,112,064 种模式来表示不同的字符。这些“宽字符”占用更多空间,但 UTF-8 的处理速度往往比其他一些编码方案快。为什么每个人都对 UTF-8 赞不绝口?部分原因是在 ESPN 和 TCM 上看到的支持 UTF-8 的广告中突显的热门模特,但主要是因为 UTF-8 模仿 ASCII,如果您没有涉及任何特殊字符,它会精确地跟踪 ASCII。
这如何影响 PHP?
我知道你在想什么。我只需要在我的元标记中将字符集设置为“UTF-8”,一切都会好起来的。但这并不正确。首先,简单的事实是 PHP 并非真正设计用于处理多字节字符,因此使用标准字符串函数对这些字符进行操作可能会产生不确定的结果。当我们需要处理这些多字节字符时,我们需要使用一组特殊的函数:mbstring 函数。其次,即使您控制了 PHP,仍然可能存在问题。覆盖您的通信的 HTTP 标头也包含字符集标识,这将覆盖页面元标记中的内容。那么,PHP 如何处理多字节字符呢?有两组函数会影响多字节字符串。第一个是 iconv。从 5.0 版本开始,这已成为语言的默认部分,一种将一种字符集转换为另一种字符集表示的方法。这不是我们将在本文中讨论的内容。第二个是多字节支持,这是一系列以“mb_”为前缀的命令。这些命令有很多,快速回顾一下表明,其中一些命令与根据给定的编码方案确定字符是否合适有关,而其他命令是面向搜索的函数,类似于 PHP 正则表达式的一部分,但面向多字节函数。
为 PHP 启用多字节支持
多字节支持不是 PHP 的默认功能,但它也不需要我们下载任何额外的库或扩展;它只需要一些重新配置。不幸的是,如果您使用的是托管版本的 PHP,这可能不是您可以执行的操作。使用 phpinfo() 函数查看您的配置。向下滚动输出大约一半,将有一个名为“mbstring”的部分。这将向您显示是否启用了基本功能。有关如何启用此功能的信息,您可以参考手册。简而言之,您可以通过使用 --enable-mbstring 编译时选项启用 mb 函数,并设置运行时配置选项 mbstring-encoding_translation。当然,最终的解决方案是 PHP 6,因为它将使用 IBM (请大家摘掉帽子) ICU 库来确保对多字节字符集的原生支持。我们所要做的就是坐下来等待,对吧?但在那之前,请查看现在可用的多字节支持。
多字节字符串命令
可能有 53 个不同的多字节字符串命令。也可能有 54 个。我在某个时候有点数不清了,但你明白我的意思。不用说,我们不会逐一讲解,但为了好玩,让我们快速浏览几个。
mb_check_encoding() 函数检查以确定特定编码序列对于编码方案是否有效。该函数不会告诉您字符串的编码方式(或它将适用于哪些方案),但它会告诉您它对于指定的方案是否有效。
<?php $string = 'u4F60u597Du4E16u754C'; $string = json_decode('"' . $string . '"'); $valid = mb_check_encoding($string, 'UTF-8'); echo ($valid) ? 'valid' : 'invalid'; ?>
您可以在 PHP 手册中找到支持的编码列表。
strlen() 函数返回字符串中的字节数。对于每个字符都是单个字节的 ASCII,这可以很好地找到字符数。对于多字节字符串,您需要使用 mb_strlen() 函数。
<?php $string = 'u4F60u597Du4E16u754C'; $string = json_decode('"' . $string . '"'); $valid = mb_check_encoding($string, 'UTF-8'); echo ($valid) ? 'valid' : 'invalid'; ?>
mb_ereg_search() 函数执行传统字符搜索的多字节版本。但有一些注意事项——您需要使用 mb_regex_encoding() 函数指定编码方案,正则表达式没有分隔符(它只是模式部分),并且正则表达式和字符串都是使用 mb_ereg_search_init() 指定的。
<?php $string = 'u4F60u597Du4E16u754C'; $string = json_decode('"' . $string . '"'); echo strlen($string); // 输出 12 – 错误! echo mb_strlen($string, 'UTF-8'); // 输出 4 ?>
足够了吗?
我不知道你怎么样,但我认为世界真的需要更多简单的东西。不幸的是,多字节处理并不能满足这种需求。但就目前而言,这是你不能忽视的事情。有时你将无法执行正常的 PHP 字符串处理(因为你试图对超过正常 ASCII 范围(U 0000 – U 00FF)的字符进行处理)。这意味着你必须使用面向 mb_ 的函数。想了解更多?说真的,你想吗?我真以为这会吓跑你。我对此毫无准备。我的时间到了。你最好的选择是什么?查看 PHP 手册。哦,还要尝试一些东西。没有什么能替代实际使用某物的经验。
(此处应保留原文FAQ部分,因为其内容与文章主题高度相关,且改写后反而会降低可读性。)
以上是PHP主|使用多弦字符串的详细内容。更多信息请关注PHP中文网其他相关文章!