2011-01-03 5 views
3

두 개의 문자열이 겉으로는 같은 값입니다. 하나는 배열의 키로 저장되고, 다른 하나는 다른 배열의 값으로 저장됩니다. 나는 두 가지를 ==, ===, 그리고 strcmp를 사용하여 비교한다. 모두 다른 문자열로 취급합니다. 나는 var_dump를하고 이것이 내가 얻는 것이다.PHP에서 문자열 비교 관련 문제

string(17) "Valentine’s Day" 
string(15) "Valentine's Day" 

왜 첫 번째 문자열이 17 문자가되고 두 ​​번째 15 문자가 될지 알 수있는 사람이 있습니까?

업데이트 : 두 개의 다른 아포스트로피를 거의 구별 할 수없는 글꼴을 내 편집자가 붙여 넣으면이 사실이 약간 더 분명합니다.

+7

은 다른 문자 인코딩의 문제처럼 보입니다. 어포 스트로피가 각 경우마다 다릅니다. – GSto

+0

아주 좋은 지적입니다! – Chestone

답변

7

첫 번째 문자열에는 아포스트로피의 유니 코드 문자가 포함되는 반면 두 번째 문자열에는 일반 ASCII 문자 만 포함됩니다.

유니 코드 문자는 더 많은 공간을 차지합니다.

당신이 그 문자의 각에 PHP ord() 기능을 실행하면 당신은 당신이 각각 다른 값을 얻을 것을 볼 수 있습니다 :

echo ord("’"); //226 This is just the first 2 bytes (see comments below for details from ircmaxell) 
echo ord("'"); //27 
+0

빙고. 모두 아포스트로피에 있습니다. – Phoenix

+1

조금 더 명확하게하기 위해 "더 많은 공간을 차지합니다"는 의미는 유니 코드 문자가 여러 바이트를 나타냄을 의미합니다. PHP는 현재 멀티 바이트 안전하지 않습니다. 이를 위해 mb_ * 함수가 있습니다. – simshaun

+1

Pedantic note : '226'결과는 해당 문자를 구성하는 3 바이트 중 첫 번째 문자입니다 ('226'은 3 바이트 블록의 시작 블록 임). 그래서 'ord'가 자동으로 버리는 2 바이트가 더 있습니다. (그래서 2 글자를 볼 수 있습니다) ... – ircmaxell

0

를 '! ='

주로. 이것이 문제가되지 않기를 원한다면, 이와 같이 할 수 있습니다.

경우 (없는 str_replace ('', ''\ '', "발렌타인 데이") == "발렌타인 데이") {

권리 인 이상 @ 마크의 대답 보완
1

합니다 (는이다 멀티 바이트 문자, 대개는 UTF-8이며, '은 그렇지 않습니다. 쉽게 예를 당 iconv를 사용하여 ASCII (또는 ISO-8859-1)로 변환 할 수 있습니다 :

echo iconv('utf-8', 'ascii//TRANSLIT', $str); 

참고 : 모든 문자가 ASCII 또는 라틴에 멀티 바이트로 변환 할 수 있습니다. //IGNORE을 사용하여 결과 문자열에서 제거 할 수 있습니다.