2016-11-23 1 views
0
arr = new Int8Array([-1,-1],0); // gives [-1,-1] 

    str = new TextDecoder('utf-8').decode(arr); // gives "��" 

    res = new TextEncoder('utf-8').encode(str); // gives [239, 191, 189, 239, 191, 189] instead of [-1,-1] 

부정적인 값에 대해서만 작동하지 않습니다. 완벽하게 작동합니다. 다른 옵션은 없습니까?TextEncoder가 여분의 바이트를주고 TextDecoder가 음수 값을 가진 배열의 바이트에 잘못된 문자열을 제공합니다.

답변

2

제 1 바이트가

TextDecoder 인터페이스 기본 ArrayBuffer (바이트 시퀀스) 동작에 부정적인 아닌 Int8Array보기가 랩.

이 다음 바이트를 0xFF 0xFF라고 함유 ArrayBuffer이다

new TextDecoder('utf-8').decode(new Int8Array([-1, -1]).buffer) 

:

new TextDecoder('utf-8').decode(new Int8Array([-1, -1])) 

는 동일하다. 이 오류로 디코딩, 그래서 UTF-8 디코딩

를 0xFF가 UTF-8에 유효한 코드 시퀀스되지 않습니다 :

new TextDecoder('utf-8').decode(new Uint8Array([255, 255])) 

2 부 : 그래서 동일합니다. 그 결과 치환 문자 (U + FFFD)가됩니다. 두 가지를 0xFF 바이트가 있기 때문에 당신은 U + FFFD U + FFFD 가져 오거나 :

""

파트 3 : UTF-8 인코딩이

인코딩 U + FFFD이 UTF-8이 제공으로 바이트 0xEF 0xBF 0xBD. 따라서 U + FFFD U + FFFD로 문자열을 인코딩하면 바이트 0xEF 0xBF 0xBD 또는 십진수가됩니다. 239 191 189 239 191 189

... 정확히 결과로 얻은 것입니다.

이렇게 정확히 지정된대로 작동합니다.

그래서 ... 무엇이 문제입니까?

내 생각에 모든 바이트를 문자열로 인코딩 할 수 있다고 가정합니다. 텍스트 인코딩이 작동하는 방식이 아닙니다. 텍스트 인코딩은 문자열 요소에서 바이트 시퀀스로의 매핑을 정의합니다.

일부 인코딩은 문자열의 모든 요소를 ​​나타낼 수있는 것은 아니지만 UTF-8 (및 UTF-16)은 JavaScript 문자열에서 발생할 수있는 모든 코드 포인트를 나타낼 수 있습니다.

그러나 역순으로는 이 아니고이 아닙니다. 모든 바이트 시퀀스가 ​​문자에 해당하는 것은 아닙니다. 잘못된 바이트 시퀀스가 ​​발견되면 오류가 발생합니다. 기본적으로 TextDecoder API는 대체 문자 ( U + FFFD)를 생성하지만 fatal 플래그를 사용하여 예외를 throw 할 수 있습니다.

관련 문제