2009-06-19 1 views
1

많은 유럽 언어의 특수 액센트 문자를 포함하는 의학 용어를 정렬하는 문자열 비교 함수를 작성하고 있습니다. MySQL의 latin1_general_ci과 비슷한 데이터 정렬을 수행해야합니다.PHP에서 MySQL의 latin1_general_ci 데이터 정렬과 같은 것을 어떻게 달성합니까?

먼저 공백, 인용 부호, 하이픈, 괄호 등을 제거하기 위해 문자열에 기본 munging을 수행합니다. 문자가 충분히 똑똑하지 않기 때문에 기본 로케일을 사용하여 strcoll()에 문자열을 전달하면 문제가 발생합니다 예를 들어 악센트 e를 사 전적으로 정규 e와 동등하게 고려할 수 있습니다.

나는 고려해야 할 특수 문자가 모두 포함되어 있지 않기 때문에 독일어 또는 프랑스어 같은 로케일을 사용하는 것을 조심스럽게 생각합니다. latin1_general_ci 데이터 정렬과 비슷한 항목을 제공 할 로캘이 있습니까? 아니면 다른 해결책이 있습니까?

내 순진한 해결책은 악센트 부호가있는 문자를 일반 문자로 매핑 한 다음이 문자를 str_replace()과 함께 사용하여 큰 연관 배열을 만드는 것입니다. 그러나 느리고 지루한 (오류 발생 가능성이 높음) 것으로 들립니다. 가능한 경우 언어에 내장 된 것을 사용하고 싶습니다.

strcmp() 또는 strcasecmp()도 현재 로캘의 데이터 정렬을 따르지 않습니까, 아니면 그냥 strcoll()입니까?

답변

1

은 아마이 :

setlocale(LC_COLLATE, 'fr_FR.Latin1', 'fr.Latin1', 'fr_FR.Latin-1', 'fr.Latin-1'); 

strcmp()strcasecmp()은 지역화되지 않습니다.

+0

프랑스어입니까? 그 조합에서 설명되지 않는 독일어에 등장 인물이 없을까요? 아니면 FR이 특별한 것을하고 있습니까? "Indo-European"로켈을 찾았는데 현재 내가 원하는 특수 문자에 대한 원하는 결과와 계정을 생성하는지 테스트하고 있습니다. –

+0

이것은 프랑스어이지만, .Latin1/.Latin-1 수정자를 사용하여 해당 문자 세트를 강제 변환하려고합니다. 그것이 실제로 받아 들여지는 데 필요한 것은 신비한 부분입니다. – chaos

+0

방금 ​​시도했는데 이상하게도 효과가있었습니다. 기본 'C'이외의 로케일을 설정하면 strcoll()은 강조된 모든 문자를 특정 언어로 분류하지 않고 정렬 할 수 있습니다. 예를 들어, fr_FR을 설정하면 strcoll()이 독일어 ß 문자를 인식합니다. 이상한! 당신의 도움을 주셔서 감사합니다. –

0

iconv 함수를 사용하여 문자열을 정규화 할 수도 있습니다. 그것은 정상적인 상황에 대한 악센트를 처리 할 것입니다. sorting utf8 strings에 관한이 관련 질문을 참조하십시오.

+0

정확히 iconv는 어떻게 사용할 수 있습니까? 나는 이것을 시도했다 : iconv ('ISO-8859-1', 'ASCII // TRANSLIT', 'Déjérine-Klumpke') 하지만 악센트 부호가있는 e 문자가 물음표로 바뀌었다. –

+0

나는 그것을 이해했다. 어떤 이유에서 그 음역을하기 위해서, 당신은 기본 'C'로케일이 아닌 다른 로케일을 설정해야합니다. –

+0

해당 로켈에없는 문자는 여전히 음역 할 수 없습니다. 예를 들어 en_US를 시도했지만 위의 악센트 부호가있는 e를 물음표로 변환했습니다. 정확한 해결책은 여전히 ​​'C'가 아닌 다른 로케일을 설정 한 다음 strcoll()을 사용하는 것입니다. 선택한 로케일에 관계없이 모든 특수 문자를 조합 할 수 있기 때문입니다. –

관련 문제