我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PHP中国际化的字符串怎么比较

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PHP中国际化的字符串怎么比较

本篇内容主要讲解“PHP中国际化的字符串怎么比较”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP中国际化的字符串怎么比较”吧!

PHP中国际化的字符串比较对象

在 PHP 中,国际化的功能非常丰富,包括很多我们可能都不知道的东西其实都非常有用,比如说今天要介绍的这一系列的字符排序和比较的功能。

排序

正常来说,如果我们对数组中的字符进行排序,按照的是字符的 ASC2 表的顺序进行排列,如果是英文还好,但对于中文的话,排序出来的结果会是非常懵逼的。

$arr = ['我','是','硬','核','项', '目', '经', '理'];sort($arr);var_dump( $arr );// array(8) {//     [0]=>//     string(3) "我"//     [1]=>//     string(3) "是"//     [2]=>//     string(3) "核"//     [3]=>//     string(3) "理"//     [4]=>//     string(3) "目"//     [5]=>//     string(3) "硬"//     [6]=>//     string(3) "经"//     [7]=>//     string(3) "项"//   }

按照我们的习惯会以中文的拼音来对汉字进行排序,这个时候往往大家都会选择自己写排序的算法或者去找合适的 Composer 包。其实,PHP 中已经为我们准备了一个对象就是用来处理这类问题的。

$coll = new Collator( 'zh_CN' );$coll->sort($arr);var_dump( $arr );// array(8) {//     [0]=>//     string(3) "核"//     [1]=>//     string(3) "经"//     [2]=>//     string(3) "理"//     [3]=>//     string(3) "目"//     [4]=>//     string(3) "是"//     [5]=>//     string(3) "我"//     [6]=>//     string(3) "项"//     [7]=>//     string(3) "硬"//   }

没错,正是这个 Collator 类。它在实例化的时候需要指定当前的区域,比如我们指定为 zh_CN ,也就是中文字符区域,这时候再使用它的 sort() 方法就可以完成对中文字符的拼音排序。(推荐:PHP视频教程)

$coll->sort($arr, Collator::SORT_NUMERIC );var_dump( $arr );// array(8) {//     [0]=>//     string(3) "核"//     [1]=>//     string(3) "经"//     [2]=>//     string(3) "理"//     [3]=>//     string(3) "目"//     [4]=>//     string(3) "是"//     [5]=>//     string(3) "我"//     [6]=>//     string(3) "项"//     [7]=>//     string(3) "硬"//   }$coll->sort($arr, Collator::SORT_STRING );var_dump( $arr );// array(8) {//     [0]=>//     string(3) "核"//     [1]=>//     string(3) "经"//     [2]=>//     string(3) "理"//     [3]=>//     string(3) "目"//     [4]=>//     string(3) "是"//     [5]=>//     string(3) "我"//     [6]=>//     string(3) "项"//     [7]=>//     string(3) "硬"//   }

Collator 对象的 sort() 方法还支持第二个参数,用于指定当前的排序是按照字符还是数字格式进行排序。对于纯中文的内容来说,这个没有什么区别。

除了 sort() 方法之外,它还有一个 asort() 方法,就和普通的 asort() 函数一样的功能,只不过它也是支持不同的区域语言的。

$arr = [    'a' => '100',    'b' => '7',    'c' => '50'];$coll->asort($arr, Collator::SORT_NUMERIC );var_dump( $arr );// array(3) {//     ["b"]=>//     string(1) "7"//     ["c"]=>//     string(2) "50"//     ["a"]=>//     string(3) "100"//   }$coll->asort($arr, Collator::SORT_STRING );var_dump( $arr );// array(3) {//     ["a"]=>//     string(3) "100"//     ["c"]=>//     string(2) "50"//     ["b"]=>//     string(1) "7"//   }$arr = [    '中' => '100',    '的' => '7',    '文' => '50'];$coll->asort($arr, Collator::SORT_NUMERIC );var_dump( $arr );// array (//     '的' => '7',//     '文' => '50',//     '中' => '100',//   )$coll->asort($arr, Collator::SORT_STRING );var_dump( $arr );// array (//     '中' => '100',//     '文' => '50',//     '的' => '7',//   )

asrot() 方法是根据键和值一起进行排序的,所以在这里指定 SORT_STRING 和 SORT_NUMERIC 就有明显的效果了。我们可以看出,如果是根据数字排序,那么结果就是以数字内容为准的,如果是根据字符排序,那么结果就是以键值中的字符串部分为基础进行排序的。

不管是 sort() 还是 asrot() 本质上都和普通的 PHP 默认提供的 sort() 和 asrot() 函数一样的。只是它们多了区域语言的功能而已。

另外,Collator 对象中还提供了一个 sortWithSortKeys() 方法,这个是普通的 PHP 排序函数中没有的。

$arr = ['我','是','硬','核','项', '目', '经', '理'];$coll->sortWithSortKeys($arr);var_dump( $arr );// array (//     0 => '核',//     1 => '经',//     2 => '理',//     3 => '目',//     4 => '是',//     5 => '我',//     6 => '项',//     7 => '硬',//   )

它与 sort() 方法是类似的,但使用的是 ucol_getSortKey() 来生成的 ICU 排序键,在大型数组上的速度更快。

ICU 的全称是 International Components for Unicode ,也就是 Unicode 的国际化组件,它提供了翻译相关的功能,也就是我们系统中以及各类编程语言要实现国际化能力的基础。

比较

接下来就是字符串的比较,比如说我们都知道,"a" 是比 "A" 要大的,因为在 ASC2 码表中,"A" 是 65 ,"a" 是 97 。当然,这只是默认情况下的比较,在使用 Collator 对象的函数进行比较时,则是根据字典库中的排序索引进行比较的,对于中文来说,基本上就也是按照拼音的顺序来比较了。

var_dump($coll->compare('Hello', 'hello')); // int(1)var_dump($coll->compare('你好', '您好')); // int(-1)

compare() 方法就是用来进行比较的,如果两个字符串相等,返回的就是 0 ,如果第一个字符串大于第二个,返回的是 1 ,否则返回的是 -1 。从代码中,我们可以看出 "Hello" 是大于 "hello" 的,"你好" 是小于 "您好" 的( 因为 "您" 多了一个 g )。

属性设置

Collator 对象中还可以设置一些对象的属性。

$coll->setAttribute(Collator::CASE_FIRST, Collator::UPPER_FIRST);var_dump($coll->getAttribute(Collator::CASE_FIRST)); // int(25)var_dump($coll->compare('Hello', 'hello')); // int(-1)$coll->setAttribute(Collator::CASE_FIRST, Collator::LOWER_FIRST);var_dump($coll->getAttribute(Collator::CASE_FIRST)); // int(24)var_dump($coll->compare('Hello', 'hello')); // int(1)$coll->setAttribute(Collator::CASE_FIRST, Collator::OFF);var_dump($coll->getAttribute(Collator::CASE_FIRST)); // int(16)var_dump($coll->compare('Hello', 'hello')); // int(1)

这里我们是为对象指定 CASE_FIRST 属性,属性值可以指定 大写优先、小写优先 之类的,对于英文字符来说,这个可以影响排序以及对比的结果。

另外,我们还可以通过一个方法获得当前区域语言的信息。

var_dump($coll->getLocale(Locale::VALID_LOCALE)); // string(10) "zh_Hans_CN"var_dump($coll->getLocale(Locale::ACTUAL_LOCALE)); // string(2) "zh"

这两个参数分别是获得有效的区域设置信息和实际的区域信息。

排序信息

当然,我们也可以看到具体的排序信息,也就是字符在 Collator 中的编码。

var_dump(bin2hex($coll->getSortKey('Hello'))); // string(20) "b6b0bebec4010901dc08"var_dump(bin2hex($coll->getSortKey('hello'))); // string(18) "b6b0bebec401090109"var_dump(bin2hex($coll->getSortKey('你好'))); // string(16) "7b9b657301060106"var_dump(bin2hex($coll->getSortKey('您好'))); // string(16) "7c33657301060106"$coll = collator_create( 'en_US' );var_dump($coll->compare('Hello', 'hello')); // int(1)var_dump($coll->compare('你好', '您好')); // int(-1)var_dump($coll->getLocale(Locale::VALID_LOCALE)); // string(5) "en_US"var_dump($coll->getLocale(Locale::ACTUAL_LOCALE)); // string(4) "root"var_dump(bin2hex($coll->getSortKey('Hello'))); // string(20) "3832404046010901dc08"var_dump(bin2hex($coll->getSortKey('hello'))); // string(18) "383240404601090109"var_dump(bin2hex($coll->getSortKey('你好'))); // string(20) "fb0b8efb649401060106"var_dump(bin2hex($coll->getSortKey('您好'))); // string(20) "fba5f8fb649401060106"

可以看出,不用同的区域语言获取到的 getSortKey() 排序键信息是不同的,不过它们都是以 16进制 存储的,这和默认的 ASC2 码完全不同了。

错误信息

$coll = new Collator( 'en_US' );;$coll->compare( 'y', 'k' ); var_dump($coll->getErrorCode()); // int(0)var_dump($coll->getErrorMessage()); // string(12) "U_ZERO_ERROR"

使用 getErrorCode() 可以获得错误码,使用 getErrorMessage() 可以获得错误信息。关于返回的这个 U_ZERO_ERROR 并没有查找到相关的资料,希望懂行的朋友可以回复说明,大家一起学习。

排序规则强度

另外就是 Collator 对象就还有一个排序强度的设定,不过我测试的效果并没有体现出来。

$arr  = array( 'a', 'à' ,'A');$coll = new Collator( 'de_DE' );$coll->sort($arr);var_dump($coll->getStrength());var_dump( $arr ); // int(2)// array(3) {//     [0]=>//     string(1) "a"//     [1]=>//     string(1) "A"//     [2]=>//     string(2) "à"//   }$coll->setStrength(Collator::IDENTICAL);var_dump($coll->getStrength()); // int(15)$coll->sort($arr);var_dump( $arr );$coll->setStrength(Collator::QUATERNARY);var_dump($coll->getStrength()); // int(3)$coll->sort($arr);var_dump( $arr );$coll->setStrength(Collator::PRIMARY);var_dump($coll->getStrength()); // int(0)$coll->sort($arr );var_dump( $arr );$coll->setStrength(Collator::TERTIARY);var_dump($coll->getStrength()); // int(2)$coll->sort($arr );var_dump( $arr );$coll->setStrength(Collator::SECONDARY);var_dump($coll->getStrength()); // int(1)$coll->sort($arr );var_dump( $arr );

在官方文档的测试代码的结果中,指定不同的参数会返回不同的排序顺序,但我实际测试的结果却全都是一样的。所以这里就不做讲解了,因为自己也没搞明白为什么。大家了解一下即可,如果有清楚这方面知识的朋友也请留言回复一起学习哦!

总结

很有意思的一个对象吧,其实这个对象也是支持面向过程式的函数写法的,在示例代码中也有使用面向过程的方式的调用的。总体来说,按拼音排序和比较这两个功能在实际的开发中相信还是有不少用武之地的,大家可以尝试看看哦!

测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202011/source/3.PHP中国际化的字符串比较对象.php参考文档:https://www.php.net/manual/zh/class.collator.php

到此,相信大家对“PHP中国际化的字符串怎么比较”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

PHP中国际化的字符串怎么比较

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP中国际化的字符串怎么比较

本篇内容主要讲解“PHP中国际化的字符串怎么比较”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP中国际化的字符串怎么比较”吧!PHP中国际化的字符串比较对象在 PHP 中,国际化的功能非常丰
2023-06-20

php中怎么比较字符串的异同

php中怎么比较字符串的异同,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
2023-06-20

C#中怎么比较字符串

今天小编给大家分享一下C#中怎么比较字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实例using System;nam
2023-06-17

PHP中如何去比较字符串

这篇文章主要讲解了“PHP中如何去比较字符串”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中如何去比较字符串”吧!在PHP中存在着两个函数用来比较字符串,它们是strcmp() 和 s
2023-06-25

#Python3中字符串的比较

20.字符串的比较从第一个字符开始比较谁的ASCII值谁就大如果前面相同 则比较后一位直到比较出谁大如果都相同 则相等print("acc"<"b")#(输出)Trueprint("sunck"=="sunck")#(输出)Trueprin
2023-01-31

php中用于比较字符串的函数是

php 中用于比较字符串的函数包括:strcmp():返回两个字符串比较结果(相等返回0,第一个字符串大于第二个字符串返回正整数,否则返回负整数)。strncmp():比较两个字符串的前 n 个字符。strcasecmp():忽略大小写比较
php中用于比较字符串的函数是
2024-04-27

怎么在python中比较字符串的大小

怎么在python中比较字符串的大小?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python有哪些常用库python常用的库:1.requesuts;2.sc
2023-06-14

PHP比较两个字符串的方法

这篇文章主要讲解了“PHP比较两个字符串的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP比较两个字符串的方法”吧!字符串比较是字符串处理中常见的一种操作,PHP中比较两个字符串有很
2023-06-20

php中有没有字符串比较方法

这篇文章主要为大家展示了“php中有没有字符串比较方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php中有没有字符串比较方法”这篇文章吧。php中有字符串比较方法。php内置了多种字符串比较
2023-06-29

c#怎么比较字符串内容

在 c# 中,可以通过以下几种方法比较字符串内容:字符串相等操作符(== 和 !=)、字符串.equals 方法、字符串.compare 方法、字符串.compareordinal 方法、字符串.startswith 和 string.en
c#怎么比较字符串内容
2024-05-12

PHP一次编辑怎么实现字符串的比较

这篇文章主要介绍“PHP一次编辑怎么实现字符串的比较”,在日常操作中,相信很多人在PHP一次编辑怎么实现字符串的比较问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP一次编辑怎么实现字符串的比较”的疑惑有所
2023-06-20

jquery中怎么比较字符串是否相等

在 jQuery 中比较字符串是否相等有多种方式,以下是其中几种常用的方法:1. 使用 JavaScript 自带的比较操作符 "===" 或 "=="。```var str1 = "hello";var str2 = "world";if(str1 === str2){ console.log("字符串相等");}else{ console.log("字符串不相等");}
2023-05-14

PHP中怎么使用strcmp()函数对字符串进行比较

这篇文章给大家分享的是有关PHP中怎么使用strcmp()函数对字符串进行比较的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。语法:strcmp(string $str1 , string $str2 )$str1
2023-06-14

比较同一字符串中相邻字符的方法

从现在开始,努力学习吧!本文《比较同一字符串中相邻字符的方法》主要讲解了等等相关知识点,我会在编程网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!问题内容我在如何使用字符串进行操作方
比较同一字符串中相邻字符的方法
2024-04-04

Java怎么比较两个字符串的大小

这篇文章主要介绍“Java怎么比较两个字符串的大小”,在日常操作中,相信很多人在Java怎么比较两个字符串的大小问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎么比较两个字符串的大小”的疑惑有所帮助!
2023-07-04

PHP国际化组件中的国际化日历类怎么用

这篇文章主要介绍“PHP国际化组件中的国际化日历类怎么用”,在日常操作中,相信很多人在PHP国际化组件中的国际化日历类怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP国际化组件中的国际化日历类怎么用
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录