멀티 바이트 문자열을 다룰 때 MB_SCRUB는 불법 문자가 포함 된 문자열을 정리하고 후속 처리 중에 인코딩 문제로 인해 프로그램이 충돌하는 것을 방지하는 데 도움이되는 매우 실용적인 기능입니다. 그러나 MB_SCRUB를 사용한 후 많은 개발자가 문제를 일으킬 것입니다. 이로 인해 특히 응용 프로그램이 특정 인코딩 (예 : Shift_jis, ISO-8859-1 등)에 의존 할 때 시스템에서 인코딩 혼동이 발생할 수 있습니다.
그렇다면 MB_SCRUB를 사용하여 문자열을 청소 한 후 원래 인코딩을 변경하지 않으려면 어떻게해야합니까?
먼저 MB_SCRUB 의 기본 사용법을 살펴 보겠습니다.
<span><span><span class="hljs-variable">$clean</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$dirty_string</span></span><span>);
</span></span>인코딩이 지정되지 않으면 PHP는 기본적으로 내부 문자 인코딩을 사용합니다 (일반적으로 UTF-8). MB_SCRUB는 문자열을 지정된 인코딩으로 변환하려고 시도하고 변환이 실패하면 불법 문자를 u+fffd (?)로 바꿉니다. 그러나 리턴 값의 인코딩은 종종 원래 문자열의 인코딩 대신 전달할 때 지정된 인코딩입니다.
따라서 문자열이 원래 Shift_jis 인코딩되어 기본 MB_SCRUB ($ str) 로 청소하면 UTF-8 인코딩 된 문자열로 끝나면 코드가 없거나 시스템 비 호환성이 발생할 수 있습니다.
이 문제를 해결하려면 먼저 원래 문자열의 인코딩을 감지 한 다음 MB_SCRUB가 호출 될 때 인코딩을 명시 적으로 전달 해야합니다. 예를 들어:
<span><span><span class="hljs-variable">$original_encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_detect_encoding</span></span><span>(</span><span><span class="hljs-variable">$dirty_string</span></span><span>, </span><span><span class="hljs-title function_ invoke__">mb_list_encodings</span></span><span>(), </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-variable">$clean_string</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$dirty_string</span></span><span>, </span><span><span class="hljs-variable">$original_encoding</span></span><span>);
</span></span>이러한 방식으로 MB_SCRUB는 문자열을 이해하는 인코딩 방법을 알게되며 리턴 값도 동일한 인코딩을 사용합니다.
참고 : mb_detect_encoding 의 정확도는 문자열 내용과 인코딩 된 목록에 따라 다릅니다. 일부 모호한 인코딩은 올바르게 식별되지 않을 수 있습니다. 컨텍스트에 따라 가능한 한 명확하게 범위를 정의하는 것이 좋습니다.
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">clean_preserve_encoding</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$input</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_detect_encoding</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, [</span><span><span class="hljs-string">'SJIS'</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'ISO-8859-1'</span></span><span>, </span><span><span class="hljs-string">'EUC-JP'</span></span><span>], </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$encoding</span></span><span>) {
</span><span><span class="hljs-comment">// 인코딩을 감지 할 수 없습니다,기본적으로 사용됩니다 UTF-8,또는 예외를 던집니다</span></span><span>
</span><span><span class="hljs-variable">$encoding</span></span><span> = </span><span><span class="hljs-string">'UTF-8'</span></span><span>;
}
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">mb_scrub</span></span><span>(</span><span><span class="hljs-variable">$input</span></span><span>, </span><span><span class="hljs-variable">$encoding</span></span><span>);
}
</span></span>이 기능은 입력 문자열의 인코딩을 유지하기 위해 최선을 다하고, 불법 문자가 컨텐츠에 나타나더라도 인코딩의 일관성을 손상시키지 않습니다.
항상 원래 인코딩을 기록하십시오 : 시스템이 여러 인코딩을 지원 해야하는 경우 데이터 스트림에서 각 텍스트의 인코딩을 기록하는 것이 좋습니다.
UTF-8에 우선 순위가 부여됩니다 . 입력 및 출력 환경을 제어 할 수있는 경우 여러 인코딩을 혼합하여 복잡성을 피하기 위해 UTF-8 인코딩을 가능한 한 균일하게 사용하는 것이 좋습니다.
극한 상황 테스트 : 특히 외부 데이터를 처리 할 때 혼합 불법 바이트, 잘못된 BOM, 일관되지 않은 인코딩 등을 테스트해야합니다.
MB_SCRUB 로 불법 문자열을 청소하면 멀티 바이트 문자열을 안전하게 처리하는 중요한 수단이지만 명시 적으로 지정되지 않을 때 문자열의 인코딩 형식을 변경할 수 있습니다. 이 문제를 피하기 위해 MB_SCRUB를 호출 할 때 원래 인코딩을 명시 적으로 지정하여 청소 된 문자열이 여전히 원래 인코딩을 유지하도록합니다.
이는 데이터 일관성을 유지할뿐만 아니라 인코딩 변환의 부작용을 줄입니다. 다중 언어 및 다중 코딩 호환 호환 응용 프로그램을 개발할 때 필수 불가능한 실용적인 기술입니다.