PHP中国际化的字符串排序和比较对象详解(2)

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://www.heiqu.com/zysjsj.html