9

동일한 JavaScript 문자열 두 개를 비교하고 싶지만 같음 연산자 ==은 false를 반환합니다. 한 문자열에 특수 문자가 들어 있습니다 (예 : 덴마크어 å).유니 코드 문자를 비교할 때 자바 스크립트 문자열 비교가 실패합니다.

자바 스크립트 코드 : slevithan는 지적

var filenameFromJS = "Designhåndbog.pdf"; 
var filenameFromServer = "Designhåndbog.pdf"; 

print(filenameFromJS == filenameFromServer); // This prints false why? 

솔루션 나를 위해 일한 무엇 유니 코드 정규화입니다.

나는 원래의 jsfiddle을 forkvithan이 제안한 정규화 라이브러리를 사용하여 버전을 만들었습니다. 링크 : http://jsfiddle.net/GWZ8j/1/.

+0

가 =='대'==='http://stackoverflow.com/questions/359494'에 대한이 문서를 참조 객체 – Steve

+4

@Steve 피연산자가 모두 같은 유형 인 경우 느슨한 비교 또는 엄격한 비교를 사용하더라도 상관 없습니다. – PointedEars

답변

10

여기에 언급 된 다른 사람들과 달리 이것은 인코딩과는 아무런 관련이 없습니다. 오히려 두 문자열은 동일한 코드를 사용하여 동일한 시각적 문자를 렌더링합니다.

이 문제를 올바르게 해결하려면 두 문자열을 비교하기 전에 유니 코드 정규화를 수행해야합니다. 유감스럽게도 자바 스크립트에는이 기능이 내장되어 있지 않습니다. 다음은 정규화를 수행 할 수있는 자바 스크립트 라이브러리입니다.

+1

오, 나는이 대답을 얻지 않기를 바랬다 :-) 나는 그저 분명한 것을 놓치고 있었고이 간단한 작업을 위해 라이브러리가 필요하지 않았을 것이다. 답변 주셔서 감사 드리며 한번 시도해 보겠습니다. – tougher

+0

네가 맞아, 나는'CC 8A'가 'U + 30A COMBINING RING ABOVE'의 UTF-8 코드 시퀀스인데 그 앞에 'a'가오고있다. 다른 문자열은 UTF-8에서'U + 00E5 라틴어 작은 글자 A와 링 위 '를 인코딩하는'C3 A5'를 가지고 있습니다. IIRC, Mac OS는 결합 문자를 선호하지만 다른 OS는 단일 문자 모양을 선호합니다. 그러나 서버를 둘 중 하나로 변환 할 수 있어야하므로 대형 클라이언트 측 라이브러리가 필요하지 않습니다. – PointedEars

+0

PointedEars는 반드시 가능하거나 이상적인 것은 아닙니다. 예를 들어 문자열 비교를 수행하기 위해 서버 왕복을 원하지 않거나 서버에서 JavaScript를 사용 중일 수 있습니다. @Tougher, JavaScript의 향후 버전에 유니 코드 정규화를 추가하라는 제안이 있습니다. [strawman : unicode_normalization] (http://wiki.ecmascript.org/doku.php?id=strawman:unicode_normalization)을 참조하십시오. – slevithan

1

UTF-8은 복잡한 작업입니다. charset에는 á, é 등과 같은 문자에 대한 두 가지 코드가 있습니다. 이미 URL 인코딩 된 버전에서 볼 수 있듯이 문자가있는 HEX 바이트는 두 버전에서 모두 다릅니다.

자세한 내용은 this 답변을 참조하십시오.

+0

JFTR : 유니 코드가 _not_ UTF-8입니다. 유니 코드는 문자 집합 및 여러 인코딩에 대한 표준입니다. UTF-8은 이러한 인코딩 중 하나입니다. – PointedEars

+0

@PointedEars가 수정되었습니다. – user2428118

+0

이제 UTF-8이 문자 세트라는 것을 알 수 있습니다. 그렇지 않습니다. 나는 또한 당신의 전제가 틀렸다는 것을 확신한다 : UTF-8 코드 시퀀스는 0xCC로 시작할 수 없다. – PointedEars

5

자바 스크립트 동등성 연산자 ==은 다음과 같은 경우에 실패한 것으로 보입니다. 모든 경우에 프로그래머 오류입니다. 자바 스크립트의 버그가 아닙니다.

  1. 두 개의 문자열에는 동일한 수와 일련의 문자가 포함되지 않습니다.

  2. 한 문자열 앞이나 앞뒤에 공백 문자 나 줄 바꿈 문자가 있습니다. 양쪽 모두에 trim() 연산자를 사용하고 두 문자열을 자세히 살펴보십시오.

  3. 놀라운 서체. 프로그래머는 호환되지 않는 데이터 유형을 비교합니다.

  4. 다른 유니 코드 문자와 동일하게 보이지만 실제로는 다른 유니 코드 문자가있는 유니 코드 문자가 있습니다.

+0

+1,이 답변은 허용 된 것보다 유익한 방법이며 nodeJS 또는 jQuery에 무언가가 포함되어 있지 않으므로 +1하십시오. – unexist

+0

이 경우 4 번이 범인입니다 – vahanpwns

+0

다른 유니 코드 정규화는 다른 문자가 아니지만 동일한 유니 코드 코드 포인트 시퀀스가 ​​동일한 문자를 나타 내기 위해 사용되었음을 의미합니다. – James

0

나는 이와 동일한 문제가있었습니다. HTML 파일에

<meta charset="UTF-8"> 

추가

이 문제를 해결했습니다.

제 경우에는 템플릿 엔진이 json 문자열을 HTML 파일로 굽고있었습니다. 이 문자열은 유니 코드 형식입니다.

템플릿도 유니 코드 파일 이었지만 JS 엔진은 meta 태그를 추가 할 때까지 템플릿에 쓴 문자열을 latin-1 인코딩 문자열로 처리했습니다.

나는이 JSON 중 하나에 문자열 입력 비교되었다 항목 (location.title == "Mühle")