2016-09-21 9 views
1

trimmb_trim 버전이 없음을 알고 있습니다. preg_replace을 사용하여 구현하는 방법에 대한 12 개의 기사 링크가 있습니다.php trim mb safe

내가 가지고있는 질문은 보통 trim이며 기본 문자는 mb 안전합니까? 즉, 단일 바이트 공백 문자 코드로 끝나는 멀티 바이트 문자의 예가 있습니까?

답변

2

당신이 말하는 인코딩에 따라 다릅니다. UTF-16LE 및 UTF-32LE에는 모두 null 바이트로 끝나는 문자가 있습니다 (예 : trim).

문자열 "A"UTF-16LE는 바이트로 구성에서 0x610x00trim 그냥 0x61를 떠나 널 바이트를 제거합니다.

이 문제는 다른 방법으로도 발생합니다. trim은 문자열뿐만 아니라 끝 부분에서도 바이트를 제거합니다. 문자열 "a"가 UTF-16BE 인 경우 0x000x61으로 인코딩되며 trim은 다시 0x61으로 남겨 둡니다.


예 :

$utf16le = iconv("ASCII", "UTF-16LE", "a"); 
$utf16be = iconv("ASCII", "UTF-16BE", "a"); 

var_dump(
    bin2hex($utf16le), 
    bin2hex(trim($utf16le)), 
    bin2hex($utf16be), 
    bin2hex(trim($utf16be)) 
); 

출력 : 당신이 다음 아니, 어떤 충돌이없는 UTF-8에 대한 유일한 걱정 경우

string(4) "6100" 
string(2) "61" 
string(4) "0061" 
string(2) "61" 

. ASCII 호환이며 UTF-8의 모든 1 바이트 문자는 0xxx xxxx의 형식이며 멀티 바이트 문자의 모든 바이트는 최상위 비트 세트 1xxx xxxx을 가지므로 모호성이 없습니다. UTF-8 trim 기본 문자 마스크를 사용하면 안전합니다.

다른 인코딩이 염려되는 경우 해당 인코딩이 무엇인지에 달려 있습니다. trim 문자 마스크의 일부로 멀티 바이트 문자를 사용하려고하면 각 바이트가 개별적으로 처리되므로 문제가 발생합니다.

0

기본 문자 마스크 (공백 + \t\n\r\0\x0B)의 문자는 ASCII이므로 trim()에 멀티 바이트 문자열을 사용하는 것이 안전합니다.

trim(' 漢字は '); // ok 

멀티 바이트 문자가있는 문자 마스크는 문제를 일으킬 수 있습니다.

trim('はは漢字はは', 'は'); // bad 
+0

전적으로 문자열의 인코딩에 따라 다릅니다. UTF-8 문자열로 기본 문자 마스크를 사용하는 것은 좋지만 문자열이 UTF-16 또는 UTF-32 인 경우에는 전혀 안전하지 않습니다. –

+0

감사합니다. 그것에 대해 생각해 보지 않았습니다. 멋진 대답. –