2014-04-15 6 views
1

전 항상 UTF-8을 사용합니다. 그러나 나는 단지 이상한 문제를 발견했다. 따라서, 페이지는 UTF-8 인코딩을 사용JavaScript는 ansi 문자열을 텍스트 필드에 넣을 수는 있지만 utf-8은 사용할 수 없습니까?

<html> 
<head> 
<meta charset="utf-8" /> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<script type="text/javascript"> 
function Foo() 
{ 
    var eacute_utf8 = "\xC3\xA9"; 
    var eacute_ansi = "\xE9"; 
    document.getElementById("bla1").value = eacute_utf8; 
    document.getElementById("bla2").value = eacute_ansi; 
} 
</script> 
</head> 
<body onload="Foo()"> 
<input type="text" id="bla1"> 
<input type="text" id="bla2"> 
</body> 
</html> 

는 HTML은 UTF-8 캐릭터 헤더가 포함

여기서 최소한 예 HTML 파일이다. 따라서 단일 E9 바이트는 유효한 utf-8로 인코딩 된 문자열이 아니므로 첫 번째 필드에는 'é'(급성) 문자가 포함되고 두 번째 필드에는 ' '과 같은 문자가 포함될 것으로 예상됩니다.

그러나 놀랍게도 첫 번째 항목에는 'Ã ©'가 포함되어 있습니다 (utf-8 데이터가 ansi 변형, 아마도 iso-8859-1 또는 windows-1252로 해석되는 것처럼). 두 번째 항목에는 실제 'é'char. 왜 이런거야!?

내 문제는 내 텍스트 편집기에서 사용하는 특정 인코딩과 관련이 없습니다. 이것은 정확히 \ x 문자 구조를 사용하는 이유입니다. 그것들은 ansi 및 utf-8 인코딩에서이 문자의 올바른 이진 표현 (ascii 호환 표기법으로)을 포함합니다.

utf-8 인코딩에서 유니 코드 U + 0119 또는 0xC4 0x99를 삽입하고 iso-8859-1 또는 windows-1252 또는 latin1에 존재하지 않는 'í'문자를 삽입한다고 가정합니다. 그게 어떻게 가능했을까요?

답변

2

JavaScript 문자열은 항상 유니 코드 문자의 문자열이며 바이트가 아닙니다. 인코딩 헤더 또는 메타 태그는 이스케이프 시퀀스 해석에 영향을 미치지 않습니다. \x 이스케이프는 바이트를 지정하지 않지만 개별 유니 코드 문자의 줄임말입니다. 따라서 동작이 예상됩니다. \xC3\u00C3과 같습니다.

+0

인코딩 헤더 또는 메타 태그는 JavaScript가 리터럴 문자열이나 이스케이프 시퀀스를 해석하는 방식과 아무 관련이 없다는 것을 알고 있습니다. 하지만 특정 시퀀스를 HTML 필드에 삽입하도록 강요하면 지정된 html ecoding에 따라 표시됩니다. 어쨌든, 지금 이해하고 있듯이, \ x * 항상 유니 코드 코드 포인트 (바이트가 아닌)를 참조하고 절대로 ansi가 아닌가? –

+1

지정된 문자 인코딩은 해당 HTML 파일이 브라우저에 의해 구문 분석되고 DOM 트리로 바뀌는 동안 의미가 있습니다. 최신의 모든 브라우저는 문자열 데이터를 내부적으로 유니 코드로 저장합니다. –

+0

예, JavaScript에서 '\ x'는 항상 유니 코드 코드 포인트를 나타냅니다. 첫 255 개의 유니 코드 코드 포인트가 하루에 꽤 인기있는 ISO-8859-1 (latin-1)과 일치하기 때문에 많은 문자가 "ANSI"가 무엇이든 일치 할 것입니다. –