广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中国际化的字符串怎么比较
  • 257
分享到

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

2023-06-20 12:06:05 257人浏览 泡泡鱼
摘要

本篇内容主要讲解“PHP中国际化的字符串怎么比较”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php中国际化的字符串怎么比较”吧!PHP中国际化的字符串比较对象在 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中国际化的字符串怎么比较”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: PHP中国际化的字符串怎么比较

本文链接: https://www.lsjlt.com/news/296693.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • PHP中国际化的字符串怎么比较
    本篇内容主要讲解“PHP中国际化的字符串怎么比较”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP中国际化的字符串怎么比较”吧!PHP中国际化的字符串比较对象在 PHP 中,国际化的功能非常丰...
    99+
    2023-06-20
  • PHP中国际化的字符串排序和比较对象详解
    目录前言排序比较属性设置排序信息错误信息排序规则强度总结前言 在 PHP 中,国际化的功能非常丰富,包括很多我们可能都不知道的东西其实都非常有用,比如说今天要介绍的这一系列的字符排序...
    99+
    2022-11-12
  • php中怎么比较字符串的异同
    php中怎么比较字符串的异同,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。<phpecho strnatcmp("2Hello&nbs...
    99+
    2023-06-20
  • C#中怎么比较字符串
    今天小编给大家分享一下C#中怎么比较字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实例using Syste...
    99+
    2023-06-17
  • #Python3中字符串的比较
    20.字符串的比较 从第一个字符开始比较谁的ASCII值谁就大 如果前面相同 则比较后一位直到比较出谁大 如果都相同 则相等 print("acc"<"b") #(输出)True print("sunck"=="sunc...
    99+
    2023-01-31
    字符串
  • PHP中如何去比较字符串
    这篇文章主要讲解了“PHP中如何去比较字符串”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP中如何去比较字符串”吧!在PHP中存在着两个函数用来比较字符串,它们是strcmp() 和 s...
    99+
    2023-06-25
  • mysql中字符串怎么比较大小
    mysql中比较字符串大小的方法通过在字符串后面加0实现比较语法:ORDER BY '123'+0;示例:SELECT '123'+0>127; -- 结果为0,表示falseSELECT '1...
    99+
    2022-10-03
  • php比较字符串的函数是什么
    php比较字符串的函数:1、strcasecmp(),大小写不敏感的比较两个字符串;2、strcmp(),大小写敏感的比较两个字符串;3、strcoll(),根据本地设置来比较两个字符串;4、strnatcasecmp(),大小写不敏感的使...
    99+
    2022-08-31
  • PHP比较两个字符串的方法
    这篇文章主要讲解了“PHP比较两个字符串的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP比较两个字符串的方法”吧!字符串比较是字符串处理中常见的一种操作,PHP中比较两个字符串有很...
    99+
    2023-06-20
  • 怎么在python中比较字符串的大小
    怎么在python中比较字符串的大小?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。python有哪些常用库python常用的库:1.requesuts;2.sc...
    99+
    2023-06-14
  • php中有没有字符串比较方法
    这篇文章主要为大家展示了“php中有没有字符串比较方法”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“php中有没有字符串比较方法”这篇文章吧。php中有字符串比较方法。php内置了多种字符串比较...
    99+
    2023-06-29
  • PHP一次编辑怎么实现字符串的比较
    这篇文章主要介绍“PHP一次编辑怎么实现字符串的比较”,在日常操作中,相信很多人在PHP一次编辑怎么实现字符串的比较问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP一次编辑怎么实现字符串的比较”的疑惑有所...
    99+
    2023-06-20
  • jquery中怎么比较字符串是否相等
    在 jQuery 中比较字符串是否相等有多种方式,以下是其中几种常用的方法:使用 JavaScript 自带的比较操作符 "===" 或 "=="。var str1 = "hello&quo...
    99+
    2023-05-14
  • Java怎么比较两个字符串的大小
    这篇文章主要介绍“Java怎么比较两个字符串的大小”,在日常操作中,相信很多人在Java怎么比较两个字符串的大小问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎么比较两个字符串的大小”的疑惑有所帮助!...
    99+
    2023-07-04
  • PHP中怎么使用strcmp()函数对字符串进行比较
    这篇文章给大家分享的是有关PHP中怎么使用strcmp()函数对字符串进行比较的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。语法:strcmp(string $str1 , stri...
    99+
    2023-06-14
  • .NET中字符串比较的最佳用法
    目录对字符串用法的建议显式指定字符串比较字符串比较的详细信息使用当前区域性的字符串比较序号字符串操作使用固定区域性的字符串操作为方法调用选择 StringComparison 成员....
    99+
    2022-11-13
  • 使用golang怎么滴字符串进行比较
    本篇文章为大家展示了使用golang怎么滴字符串进行比较,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。golang的优点有哪些golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件...
    99+
    2023-06-06
  • JavaScript字符串比较的方法有什么
    本篇内容主要讲解“JavaScript字符串比较的方法有什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript字符串比较的方法有什么”吧!Jav...
    99+
    2022-10-19
  • shell字符串怎么比较判断是否为数字
    本篇内容介绍了“shell字符串怎么比较判断是否为数字”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!二元比较操作符,比较变量或者比较数字.注...
    99+
    2023-06-09
  • c语言中怎么用strcmp比较两个字符串
    在C语言中,可以使用strcmp函数来比较两个字符串。strcmp函数是一个标准库函数,用于比较两个字符串的大小。strcmp函数的...
    99+
    2023-10-10
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作