PHP의 국제화된 문자열 비교 객체
PHP에서는 국제화 기능이 매우 풍부합니다. 오늘 소개할 일련의 문자 정렬 및 비교 기능과 같이 우리가 알지 못했던 많은 기능이 실제로 매우 유용하다는 것을 포함합니다.
Sort
보통 배열의 문자를 정렬하면 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 개체는 일반 PHP 정렬 기능에서는 사용할 수 없는 sortWithSortKeys() 메서드도 제공합니다.
$arr = ['我','是','硬','核','项', '目', '经', '理']; $coll->sortWithSortKeys($arr); var_dump( $arr ); // array ( // 0 => '核', // 1 => '经', // 2 => '理', // 3 => '目', // 4 => '是', // 5 => '我', // 6 => '项', // 7 => '硬', // )
sort() 메서드와 유사하지만 ucol_getSortKey()를 사용하여 대규모 배열에서 더 빠른 ICU 정렬 키를 생성합니다.
ICU의 전체 이름은 Unicode의 국제 구성 요소인 International Components for Unicode입니다. 이는 우리 시스템과 다양한 프로그래밍 언어의 국제화 기능의 기반이 되는 번역 관련 기능을 제공합니다.
비교
다음 단계는 문자열 비교입니다. 예를 들어 ASC2 코드 테이블에서 "A"는 65이고 "a"는 "a"보다 크다는 것을 모두 알고 있습니다. 97. 물론 이는 기본적으로 비교일 뿐이며, Collator 객체의 기능을 비교용으로 사용하는 경우에는 사전 라이브러리의 정렬 색인을 기준으로 비교되며, 중국어의 경우 기본적으로 병음순으로 비교됩니다. 비교에는
var_dump($coll->compare('Hello', 'hello')); // int(1) var_dump($coll->compare('你好', '您好')); // int(-1)
compare() 메서드가 사용됩니다. 두 문자열이 같으면 0이 반환되고, 첫 번째 문자열이 두 번째 문자열보다 크면 1이 반환됩니다. 코드에서 "Hello"는 "hello"보다 크고 "hello"는 "hello"보다 작다는 것을 알 수 있습니다("you"에는 추가 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의 국제화된 문자열 비교 객체의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!