2012-07-29 3 views
1

htmlspecialchars()가 길이가 0 인 문자열을 반환하도록하는 특정 문자열 (완전히 인쇄 할 수는 없지만 아래에서 볼 수 있음)이 있습니다. 이 문제를 해결할 수있는 방법이 있습니까?htmlspecialchars가 텍스트가 사라지는 원인이됩니다.

$Stmnt = 'SELECT subject_name FROM bans WHERE id = 2321'; 
$Fetch = $Conn->query($Stmnt); 
if(!$Fetch) 
    die('Could not query DB'); 
while($Row = $Fetch->fetch_array(MYSQLI_ASSOC)) 
{ 
    $RawName = $Row['subject_name']; 
    $RawLen = strlen($RawName); 
    echo('RAW NAME: ['.$RawName.']'.', LENGTH: ['.$RawLen.']'.'<br />'); 
    for($i = 0; $i < $RawLen; $i++) 
     echo('CHAR '.$i.' = ['.$RawName[$i].'] (ORD: '.ord($RawName[$i]).')<br />'); 

    $CleanName = htmlspecialchars($RawName, ENT_QUOTES, 'UTF-8'); 
    $CleanLen = strlen($CleanName); 
    echo('CLEAN NAME: ['.$CleanName.']'.', LENGTH: ['.$CleanLen.']'.'<br />'); 
    for($i = 0; $i < $CleanLen; $i++) 
     echo('CHAR '.$i.' = ['.$CleanName[$i].'] (ORD: '.ord($CleanName[$i]).')<br />'); 
} 
$Fetch->close(); 
echo('DONE'); 

출력 :이 길이가 0 인 문자열을 반환 왜 내가 지금 이해

RAW NAME: [━═★ Coммander Fι5н �], LENGTH: [31] 
CHAR 0 = [�] (ORD: 226) 
CHAR 1 = [�] (ORD: 148) 
CHAR 2 = [�] (ORD: 129) 
CHAR 3 = [�] (ORD: 226) 
CHAR 4 = [�] (ORD: 149) 
CHAR 5 = [�] (ORD: 144) 
CHAR 6 = [�] (ORD: 226) 
CHAR 7 = [�] (ORD: 152) 
CHAR 8 = [�] (ORD: 133) 
CHAR 9 = [ ] (ORD: 32) 
CHAR 10 = [C] (ORD: 67) 
CHAR 11 = [o] (ORD: 111) 
CHAR 12 = [�] (ORD: 208) 
CHAR 13 = [�] (ORD: 188) 
CHAR 14 = [�] (ORD: 208) 
CHAR 15 = [�] (ORD: 188) 
CHAR 16 = [a] (ORD: 97) 
CHAR 17 = [n] (ORD: 110) 
CHAR 18 = [d] (ORD: 100) 
CHAR 19 = [e] (ORD: 101) 
CHAR 20 = [r] (ORD: 114) 
CHAR 21 = [ ] (ORD: 32) 
CHAR 22 = [F] (ORD: 70) 
CHAR 23 = [�] (ORD: 206) 
CHAR 24 = [�] (ORD: 185) 
CHAR 25 = [5] (ORD: 53) 
CHAR 26 = [�] (ORD: 208) 
CHAR 27 = [�] (ORD: 189) 
CHAR 28 = [ ] (ORD: 32) 
CHAR 29 = [�] (ORD: 226) 
CHAR 30 = [�] (ORD: 148) 
CLEAN NAME: [], LENGTH: [0] 
DONE 

답변

7

. 이 질문에 대해 유감스럽게 생각합니다. 나는 게시하기 전에 더 많이 조사 했어야했다. PHP 매뉴얼 page for htmlspecialchars

: 어쨌든, 대답은 다음과 같다

입력 문자열 내에서 유효하지 않은 코드 단위 시퀀스가 ​​포함 된 경우 반환, 어느 ENT_IGNORE하지 않는 한 또는됩니다 빈 문자열을 인코딩 제공 ENT_SUBSTITUTE 플래그가 설정됩니다.

그런 다음이 문자열에 대해 "유효하지 않은"것은 무엇입니까? Wiki page for UTF-8에는 UTF-8 인코딩의 좋은 도표가 있습니다. "일반 텍스트 ASCII"를 나타내는 모든 코드 포인트는 0-127입니다 (바이트의 MSB는 항상 0입니다).

바이트의 MSB가 1 (십진수 128에서 255)이면 코드 포인트가 다중 바이트 체인으로 구성되어 있음을 UTF-8 호환 파서에 알립니다. 그리고 다음 바이트의 처음 두 문자열에서 분명히 0

다음에 일해야-비트는 최상위 1 바이트가 127 이상이고 다음 바이트가 시작되지 않는 경우가있다 1 & 0입니다. 따라서 잘못된 UTF-8 인코딩입니다.

의견을 내 의견으로는 ENT_SUBSTITUTE 플래그를 사용하는 것이 좋습니다 (또는 이러한 부적합 바이트를 삭제하면 a security issue이 아닌 것으로 확신하는 경우 ENT_IGNORE를 사용하는 것이 좋습니다). this SO post을 보내 주셔서 감사합니다.