PHP의 MB_Strcut는 멀티 바이트 문자 (예 : 중국어)를 다룰 때 매우 실용적인 기능입니다. 잘린 문자로 인한 차량 코드 문제를 피하기 위해 멀티 바이트 문자열을 안전하게 차단하는 데 사용됩니다. 그러나 많은 개발자들이 MB_Strcut를 사용할 때 일반적인 함정과 오류를 만날 것입니다. 이 기사는 기능을 올바르게 사용하는 방법을 자세히 소개하고 일반적인 문제에 대한 솔루션을 지적합니다.
질문을 파헤 치기 전에 먼저 일반적인 오해 를 명확히하겠습니다.
MB_SUBSTR 은 "문자", 즉 지정된 수의 문자를 가로 채기 위해 가로 채 웁니다.
MB_STRCUT 는 "바이트"를 기반으로 한 절편입니다. 바이트 위치에서 시작하여 많은 바이트를 가로 채고 문자 무결성을 파괴하지 않으려 고 노력합니다.
이는 중국어를 처리 할 때 (일반적으로 UTF-8이 다음 중국어를 3 바이트로 인코딩 할 때) 바이트 위치를 계산하고 부정확하게 길이를 계산하면 문자의 중간에 잘려서 출력이 발생할 수 있습니다.
바이트의 불일치로 인해 중국 줄을 가로 채고 캐릭터가 손상되지 않도록해야한다고 가정합니다.
<?php
$str = "방문에 오신 것을 환영합니다gitbox.net,이것은 시연을위한 중국인 끈입니다。";
$cutStr = mb_strcut($str, 0, 18, "UTF-8");
echo $cutStr;
?>
위의 코드는 처음 18 바이트를 가로 채기위한 것입니다. 그러나 참고 :
문자열에 중국어 (중국어의 3 바이트)가 포함 된 경우, 18 바이트는 캐릭터의 한가운데서 잘릴 수 있습니다.
MB_STRCUT는 문자를 잘리지 않으려 고하지만 그 동작은 사용 된 인코딩에 달려 있습니다.
따라서 MB_Strcut 의 네 번째 매개 변수 (인코딩)가 일반적으로 "UTF-8"을 올바르게 지정 해야하는지 확인하십시오.
이것은 가장 일반적인 문제입니다. 이유는 일반적으로 다음과 같습니다.
올바른 인코딩이 설정되지 않았습니다.
인터셉트의 시작 위치 또는 길이는 문자를 잘립니다.
해결책:
항상 UTF-8 인코딩을 사용하고 출력 환경 (예 : HTML 페이지)도 UTF-8인지 확인하십시오.
header("Content-Type: text/html; charset=utf-8");
예를 들어, "10 바이트"대신 "10 문자"를 표시하려면 MB_Strcut는 바이트를 기반으로하기 때문에 적용되지 않습니다. mb_substr을 사용해야합니다.
$cutStr = mb_substr($str, 0, 10, "UTF-8");
중간에서 바이트를 가로 채기 시작하면 (예 : 5 번째 바이트부터 시작) 캐릭터의 중간에 떨어질 수 있으므로 차단 실패 또는 출력 예외가 발생할 수 있습니다.
제안:
바이트 오프셋이 아닌 문자 경계에서 가능한 한 많이 차단하십시오.
바이트에 따라 작동 해야하는 경우 먼저 MB_Strcut를 사용하여 출력 효과를 점차 테스트 할 수 있습니다.
반복적 인 실수를 피하기 위해 중국 문자열을 안전하게 가로 채는 기능을 캡슐화 할 수 있습니다.
function safeCutStr($string, $length, $charset = "UTF-8") {
return mb_strcut($string, 0, $length, $charset);
}
페이지 출력 전에 사후 처리를 추가하여 마지막 문자가 완료되었는지 여부를 결정하고 필요한 경우 불완전한 문자를 생략 할 수도 있습니다.
중국어와 같은 다중 바이트 문자 세트를 다룰 때 MB_Strcut을 사용하면 차단 효율을 향상시킬 수 있지만 바이트와 문자의 관계에 대해 충분히 조심해야합니다. 구식 코드 문제를 최대한 피하기 위해 :
항상 올바른 인코딩 (예 : UTF-8)을 지정합니다.
문자를 가로 채기 위해 가능한 한 MB_SUBSTR을 사용하십시오.
바이트에 의해 가로 채지 않아야하는 경우 캡슐화 결함 공차 로직을 고려하십시오.
MB_STRCUT를 합리적으로 사용하면 중국어를 처리 할 때 PHP 프로그램을보다 강력하고 안정적으로 만들 수 있습니다.