현재 위치: > 최신 기사 목록> 다른 로케일 설정에서 strcoll의 행동 차이

다른 로케일 설정에서 strcoll의 행동 차이

gitbox 2025-05-30

다국어 응용 프로그램을 개발할 때는 종종 문자열 비교 문제가 포함됩니다. PHP는 문자열을 비교하는 여러 가지 방법을 제공하며, strcoll () 함수는 현재 로케일을 기반으로 비교 결과를 결정하기 때문에 특히 흥미 롭습니다. 이 기사는 다른 로케일 설정에서 strcoll () 의 성능 차이를 탐색하고 특정 코드 예제를 통해 설명합니다.

1. strcoll () 란 무엇입니까?

strcoll () 은 PHP의 내장 기능으로 로케일 설정을 기반으로 두 줄을 비교합니다. strcmp () 와 유사한 결과를 반환합니다.

  • 두 줄이 현재 로케일에서 동일하다는 것을 나타 내기 위해 0을 반환합니다.

  • 0 미만의 반환 란 첫 번째 문자열이 두 번째 문자열 이전에 순위가 매겨 졌음을 의미합니다.

  • 첫 번째 문자열이 정렬에서 두 번째 문자열 이후임을 나타 내기 위해 0보다 크게 반환됩니다.

strcmp () 와 달리 strcoll ()은 문자의 분류 방법, 사례 민감도 및 일부 특수 문자 처리와 같은 로케일 규칙을 고려합니다.

2. 로케일을 설정하는 방법

PHP에서는 setlocale () 함수를 사용하여 현재 로케일 설정을 설정할 수 있습니다. 예를 들어:

 setlocale(LC_COLLATE, 'en_US.UTF-8');

LC_COLLATE 는 문자열 비교 및 ​​정렬에 영향을 미치는 데 특별히 사용되는 범주입니다. LC_TIME , LC_MONETARY 등과 같은 다른 범주는 시간, 통화 및 기타 형식에 영향을 미칩니다.

3. 다른 지역 환경의 비교 차이

두 로케일 인 독일어 및 영어를 예로 들어 STRCOLL () 의 성능 차이를 살펴 보겠습니다.

 setlocale(LC_COLLATE, 'en_US.UTF-8');
echo strcoll("z", "?"); // 출력 결과 A

setlocale(LC_COLLATE, 'de_DE.UTF-8');
echo strcoll("z", "?"); // 출력 결과 B

영어로 "Z"는 "이전"입니까? ", 독일인이기 때문에"? " Phonic Letter로 간주되며 "z"또는 "A"근처에있을 수 있습니다. 따라서 출력 결과 A 및 B는 다를 수 있습니다.

4. 실제 사례 : 다국어 정렬

사용자의 언어 선호도에 따라 정렬하려는 악센트가있는 이름 세트가 있다고 가정합니다. 코드는 다음과 같습니다.

 $names = ["Zoe", "?nne", "Anna", "émile"];

setlocale(LC_COLLATE, 'en_US.UTF-8');
usort($names, function($a, $b) {
    return strcoll($a, $b);
});
print_r($names);

en_us.utf-8 에 따라 정렬은 다음과 같습니다.

 Array
(
    [0] => Anna
    [1] => émile
    [2] => Zoe
    [3] => ?nne
)

de_de.utf-8 로 대체 된 경우 :

 setlocale(LC_COLLATE, 'de_DE.UTF-8');

그런 다음 얻을 수 있습니다.

 Array
(
    [0] => Anna
    [1] => ?nne
    [2] => émile
    [3] => Zoe
)

5. 사용 가능한 로케일을 얻는 방법?

일부 시스템에서 사용 가능한 로케일은 제한 될 수 있습니다. 명령 줄에서 다음 명령을 실행하여 볼 수 있습니다.

 locale -a

또는 PHP에서 로케일을 설정하고 SetLocale () 의 반환 값을 사용하여 성공 여부를 결정하십시오.

VI. 개발 제안

  1. 로케일이 올바르게 설정되어 있는지 항상 setlocale () 의 반환 값을 확인하십시오 .

  2. 사용자 입력 언어를 민감하게 정렬 해야하는 경우 strcmp () 대신 strcoll ()을 사용해야합니다.

  3. 크로스 플랫폼 일관성을 위해 응용 프로그램에 필요한 로케일을 명확하게 지정하고 이러한 설정이 서버 구성에서 지원되는지 확인하는 것이 좋습니다.

  4. strcoll () 의 정렬 결과가 프론트 엔드 디스플레이 (예 : 연락처 목록, 국가 이름 등)에 사용되는 경우 테스트에서 다른 로컬을 시뮬레이션하여 정렬 로직이 기대에 충족되도록하십시오.

7. 온라인 데모 및 디버깅

다음 주소를 사용하여 다른 지역의 분류 효과를 시도 할 수 있습니다.

 https://gitbox.net/locale-strcoll-demo.php

이 페이지는 다른 로케일을 선택하고 문자열 쌍을 입력하여 비교하여 다른 로케일에서 strcoll () 의 성능을 직관적으로 이해할 수 있도록 지원합니다.

결론

strcoll () 은 매우 유용하지만 종종 간과되는 기능입니다. 로케일을 합리적으로 설정함으로써 사용자 언어 습관에 더 일치하는 문자열 비교 로직을 구현하는 데 도움이 될 수 있습니다. 다국어 프로젝트에서 strcoll () 을 잘 활용하면 사용자 경험을 크게 향상시킬 수 있습니다.