2016-10-07 13 views
2

두 함수 mb_detect_encoding 및 mb_check_encoding의 논리를 이해하려고하지만 설명서가 좋지 않습니다. 윈도우 1252 인코딩을 사용하는 경우 소문자 아주 간단한 테스트 문자열PHP의 mb_detect_encoding 및 mb_check_encoding 함수의 결과 이해

$string = "\x65\x92"; 

을 시작으로 'A'곱슬 따옴표 하였다.

나는 다음과 같은 결과를 얻을 :

mb_detect_encoding($string,"Windows-1252"); //false 
mb_check_encoding($string,"Windows-1252"); //true 
mb_detect_encoding($string,"ISO-8859-1"); //ISO-8859-1 
mb_check_encoding($string,"ISO-8859-1"); //true 
mb_detect_encoding($string,"UTF-8",true); //false 
mb_detect_encoding($string,"UTF-8"); //UTF-8 
mb_check_encoding($string,"UTF-8"); //false 

detect_encoding이 https://en.wikipedia.org/wiki/ISO/IEC_8859-1https://en.wikipedia.org/wiki/Windows-1252에 따라 때, "윈도우 1252"문자열은 "ISO-8859-1"을 제공하지만 왜 이해가 안 돼요 바이트 x92는 ISO-8859-1이 아닌 Windows-1252 문자 인코딩에 정의됩니다.

둘째, detect_encoding이 false를 반환하는 방식을 이해하지 못했지만 check_encoding은 동일한 문자열 및 동일한 문자 인코딩에 대해 true를 반환 할 수 있습니다.

마지막으로, 왜 문자열이 모두 UTF-8, 엄격 모드로 감지되는지 이해할 수 없습니다. 바이트 x92는 UTF-8의 연속 바이트이지만이 문자열에서 시퀀스의 선두 바이트가 아닌 유효한 문자 바이트입니다.

답변

0

이 예제는 직관적이지 못하고 때로는 논리적으로 잘못되어 왜 mb_detect_encoding을 사용해야 하는지를 잘 보여줍니다. 이 사용해야 할 경우, 세 번째 매개 변수로 strict = true에서 항상 패스 (그래서 비 UTF8 문자열은 UTF8로보고되지 않습니다.

그것은 원하는 인코딩의 배열을 통해 mb_check_encoding을 실행하는 데 좀 더 안정적입니다 , 가능성/우선 순위의 예를 들면 다음과 같습니다.

$encodings = [ 
    'UTF-8', 
    'Windows-1252', 
    'SJIS', 
    'ISO-8859-1', 
]; 

$encoding = 'UTF-8'; 
$string = 'foo'; 
foreach ($encodings as $encoding) { 
    if (mb_check_encoding($string, $encoding)) { 
     // We'll assume encoding is $encoding since it's valid 
     break; 
    } 
} 

순서는하지만 우선 순위에 따라

.