문제

오늘 저는 PHP 기능에 문제가 생겼습니다. strpos() 올바른 결과가 분명히 0 인 경우에도 False가 반환 되었기 때문에 이것은 하나의 매개 변수가 UTF-8에서 인코딩되었지만 다른 매개 변수는 분명히 HTTP get 매개 변수입니다.

이제 나는 그것을 사용하는 것을 알아 차렸다 mb_strpos 기능은 내 문제를 해결했습니다.

내 질문은 이제 : 앞으로이 문제를 피하기 위해 일반적으로 PHP Multibyte 문자열 기능을 사용하는 것이 현명한가? 전통을 피해야합니다 strpos, strlen, ereg, 등 등. 기능은 전혀?

주목 : 설정하고 싶지 않습니다 mbstring.func_overload Php.ini의 글로벌, 이것은 배 라이브러리를 사용할 때 다른 문제로 이어집니다. PHP4를 사용하고 있습니다.

도움이 되었습니까?

해결책

사용중인 인코딩 캐릭터에 따라 다릅니다. 단일 바이트 캐릭터 인코딩 또는 UTF-8 (캐릭터 내부의 단일 바이트를 다른 문자로 오해 할 수없는 경우)에서 검색하는 문자열과 검색에 사용하는 문자열이 동일합니다. 인코딩 그러면 일반 문자열 검색 기능을 계속 사용할 수 있습니다.

UTF-8 이외의 다중 바이트 인코딩을 사용하는 경우 다른 문자처럼 문자가 나타나는 것을 방해하지 않는 경우 일반 문자열 검색 함수를 사용하여 문자열 검색을 수행하는 것이 안전하지 않습니다. 당신은 잘못된 긍정을 찾을 수 있습니다. 이는 STRPO와 같은 함수의 PHP의 문자열 비교가 바이트마다 이루어 지고이 문제를 방지하기 위해 특별히 설계된 UTF-8을 제외하고, 다중 바이트 인코딩은 다음으로 구성된 문자의 후속 바이트가 문제를 겪기 때문입니다. 둘 이상의 바이트가 다른 캐릭터의 일부와 일치 할 수 있습니다.

검색하는 문자열이있는 경우 안에 그리고 당신이 검색하고있는 문자열은 다른 문자 인코딩이므로 변환이 항상 필요합니다. 그렇지 않으면 다른 인코딩에서 다르게 표현되는 문자열의 경우 항상 False를 반환합니다. 입력에 대한 변환을 수행해야합니다. 앱이 사용하는 문자를 결정하고 응용 프로그램 내에서 일관성을 유지하십시오. 다른 인코딩에서 입력을받을 때마다 도중에 변환하십시오.

다른 팁

5.2 이전에 PHP 버전에서 MB_ * 기능에 문제가있었습니다. 따라서 코드가 다른 버전의 PHP를 가진 여러 플랫폼에서 진행되는 경우 이상한 동작이 발생할 수 있습니다. 또한 MB_ strpos 함수는 다소 느립니다. 오프셋 매개 변수로 지정된 문자 수를 건너려면 내부적으로 사용되는 실제 바이트 위치를 얻습니다. STRPOS/MB_STRPOS 기능에 따라 루프에서는 주요 병목 현상이 될 수 있습니다.

모든 곳에서 동일한 인코딩을 사용하는 경우 일반적으로 문제가되지 않습니다. 나는 모든 페이지에 UTF-8을 사용하고 있으며 실제로이 문제를 겪지 않았습니다. 결국 그것은 실제로 페이지와 데이터베이스에 대한 동일한 인코딩을 지정하는 것으로 나타납니다.

예를 들어:

header('Content-type: text/html;charset=utf-8');
mysql_query('SET NAMES utf8');

대부분의 경우 이는 응용 프로그램의 모든 데이터 소스가 동일한 인코딩으로 데이터를 전달하므로 이러한 종류의 문제를 피할 수 있습니다.

이는 전체 유니 코드 지원을 포함하기 때문에 Advent PHP 6, BTW를 사용하면 훨씬 나을 것입니다.

반드시 MB_Strpos를 사용할 필요는 없지만 앱의 모든 데이터가 동일 해야하는지 확인해야합니다 : MB_STRING 또는 하나의 특정 인코딩의 일반 문자열. (보통 UTF-8.)

페이지가 UTF-8인지 확인하고 양식 제출물이 UTF-8으로 해석되고 데이터베이스 저장 UTF-8은 일반적으로 괜찮습니다. 인덱스 된 문자열 작업 (특히 자리한 자리)은 UTF-8 시퀀스를 깨뜨릴 수 있으며, 이는 성가 시지만 일반적으로 비참하지는 않습니다. 해당 수준의 지원이 필요한 경우 MB_Strings가 유일한 옵션입니다 (물론 앱과 라이브러리 및 PHP 버전의 모든 부분이 올바르게 대처할 수 있는지 확인해야합니다).

PHP에서 유니 코드를 올바르게 처리하는 사이트를 개발하는 것은 지금 당장 재미 있지 않습니다. 유니 코드 지원은 Python 및 .NET와 같은 언어에 비해 매우 열악합니다. PHP6이 문제를 개선 할 것으로 기대됩니다.

다음 PHP UTF-8 라이브러리를 사용하는 것이 좋습니다.

http://sourceforge.net/projects/phputf8

애플리케이션으로 번들로 사용하면 MBString 확장 기능이 필요하지 않아 응용 프로그램의 요구 사항이 풀리지 만 여전히 UTF-8 문자열 함수가 나타납니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top