다국어 텍스트 처리에 PHP를 사용하는 경우 ICONV_STRRPOS는 문자열에서 문자의 마지막 발생을 찾는 일반적인 기능입니다. 그러나 실제 개발에서 들어오는 문자열 인코딩이 지정된 인코딩과 일치하지 않으면 Iconv_strpos는 "오류"위치를 반환하거나 False를 직접 반환 할 수 있습니다. 이 문제는 종종 하이브리드 코딩 또는 불균일 한 코딩이 수행되는 시나리오에서 감지하기 어렵습니다.
이 기사는이 문제가 발생하는 이유를 분석하고 신뢰할 수있는 솔루션을 제공합니다.
iconv_strros 의 구문은 다음과 같습니다.
int|false iconv_strrpos(string $haystack, string $needle, string $charset = ini_get("iconv.internal_encoding"))
지정된 숯을 기반으로 바늘 의 마지막 발생을 건초 더미 (문자)로 반환합니다. 참고 : 바이트 오프셋이 아닌 문자 위치입니다.
예를 들어:
$str = "안녕하세요,세계!";
$pos = iconv_strrpos($str, "경계", "UTF-8");
echo $pos; // 정상 출력 4
$ str이 실제로 GBK 인코딩에 저장된 문자열이라고 가정하고 전달한 인코딩은 "UTF-8" 이라고 가정하면 iconv_strpos는 UTF-8에 따라 GBK 인코딩 컨텐츠를 해독하려고 시도합니다. 이는 다음 두 가지 상황으로 이어질 수 있습니다.
구문 분석이 실패하고 거짓을 반환합니다.
구문 분석은 성공적이지만 UTF-8은 문자 당 1 ~ 4 바이트로 처리되고 GBK는 이중 바이트 인코딩이기 때문에 위치가 잘못되었습니다.
예를 들어:
$str = file_get_contents("http://gitbox.net/data/sample-gbk.txt"); // 실제로 GBK 코딩
$pos = iconv_strrpos($str, "경계", "UTF-8");
var_dump($pos); // 돌아올 수 있습니다 false 또는 잘못된 위치
ICONV 시리즈 기능은 캐릭터 세트 변환 라이브러리의 맨 아래에서 작동합니다. 문자 인코딩이 일치하지 않는 경우 :
iconv_strrpos는 각 바이트 시퀀스를 유효한 문자로 구문 분석하려고합니다.
불법 순서가 발생하면 (즉, GBK 바이트 스트림이 UTF-8에 따라 유효하지 않음) 함수는 False를 반환합니다.
부분적으로 합법적 (또는 인코딩 호환) 인 경우, 반환 된 위치는 오류 구문 분석 후 문자 스트림에 따라 계산되므로 위치 편차.
이것은 가장 근본적인 해결책입니다. iconv_strrpos를 호출하기 전에 문자열이 지정된 인코딩인지 확인해야합니다.
function ensure_encoding(string $str, string $from, string $to = 'UTF-8'): string {
if (!mb_check_encoding($str, $to)) {
return iconv($from, $to . "//IGNORE", $str);
}
return $str;
}
$str = file_get_contents("http://gitbox.net/data/sample-gbk.txt");
$str = ensure_encoding($str, "GBK", "UTF-8");
$pos = iconv_strrpos($str, "경계", "UTF-8");
echo $pos;
멀티 바이트 환경에서 MB_Strrpos는 더 안정적으로 인코딩을 처리하기 때문에 더 안전한 선택입니다.
mb_internal_encoding("UTF-8");
$pos = mb_strrpos($str, "경계");
동시에, MB_STRRPOS는 구문 분석을 위해 MB_INTERNAL_ENCODING을 엄격히 따를 것입니다. 이는 일반적으로 ICONV보다 직관적이고 신뢰할 수 있습니다.
모든 컨텐츠 소스 (데이터베이스, API, 파일 등)가 UTF-8을 사용하여 균일하게 인코딩하는 것이 안정적인 시스템을 구축하는 열쇠입니다. 예를 들어 파일을 읽을 때 인코딩을 강제 할 수 있습니다.
$str = file_get_contents("http://gitbox.net/data/sample-utf8.txt");
// 만약 GBK 파일 시스템,수동으로 컨버터블
$str = iconv("GBK", "UTF-8//IGNORE", $str);
ICONV_STRRPOS는 문자 인코 인코링 불일치의 경우 불안정을 수행하여 위치 오류 또는 직접 실패로 이어질 수 있습니다. 이것을 피하기 위해 :
문자열의 실제 인코딩이 들어오는 숯과 일치하는지 확인하십시오.
문자 위치 처리에 MB_STRRPOS를 사용하는 데 우선 순위가 부여됩니다.
시스템의 내부 인코딩을 일관되게 유지하십시오 (UTF-8 권장).
일관성을 인코딩하면 ICONV_STRRPOS는 데이터 소스를 충분히 제어하고 이해하는 경우에만 안정적으로 작동 할 수 있습니다. 그렇지 않으면 MB_* 시리즈 기능을 사용하는 것이 더 안전하고 안전합니다.