JavaScript의 문자 세트 :
JavaScript 프로그램은 유니 코드 문자 세트를 사용하여 작성됩니다. 유니 코드는 ASCII와 라틴어 -1의 슈퍼 세트이며 지구상의 거의 모든 언어를 지원합니다. ECMAScript3은 유니 코드 2.1 및 후속 버전을 지원하기 위해 JavaScript가 필요하며 ECMASCript5는 지원 유니 코드 3 및 후속 버전이 필요합니다. 그래서 우리는 그것을 썼습니다
JavaScript 프로그램은 모두 유니 코드를 사용하여 인코딩됩니다.
UTF-8
UTF-8 (UTF8-BIT 유니 코드 변환 형식)은 유니 코드에 대한 가변 길이 문자 인코딩이며 접두사 코드이기도합니다.
유니 코드 표준의 모든 문자를 나타내는 데 사용될 수 있으며 인코딩의 첫 바이트는 여전히 ASCII와 호환되므로 원래 ASCII 문자가 소량의 수정없이 사용하거나 필요하지 않은 소프트웨어가 가능합니다. 따라서 텍스트 저장 또는 전송을위한 이메일, 웹 페이지 및 기타 응용 프로그램에서 점차 선호하는 인코딩이되었습니다.
대부분의 웹 사이트는 현재 UTF-8 인코딩을 사용합니다.
JavaScript에 의해 생성 된 유니 코드 인코딩 된 문자열 변환 UTF-8 인코딩 된 문자열로 변환
제목에서 언급했듯이 응용 프로그램 시나리오는 매우 일반적입니다. 예를 들어, 바이너리를 서버로 보낼 때 서버는 이진 컨텐츠의 인코딩이 UTF-8이어야한다고 규정합니다. 이 경우 JavaScript의 유니 코드 문자열을 프로그램을 통해 UTF-8 인코딩 문자열로 변환해야합니다.
변환 방법
변환 전에 유니 코드의 인코딩 구조가 고정되어 있음을 이해해야합니다.
당신이 그것을 믿지 않는다면, 당신은 문자열의 charcodeat 메소드를 시도하여 반환 된 charcode가 얼마나 많은 바이트를 차지하는지 확인할 수 있습니다.
• 영어는 1 인물을 차지하고 한자가 2자를 차지합니다.
그러나 UTF-8의 인코딩 구조의 길이는 단일 문자의 크기에 의해 결정됩니다.
아래는 여러 바이트를 차지하는 단일 문자의 크기입니다. 단일 유니 코드 문자 후 최대 길이는 6 바이트입니다.
• 1 바이트 : 유니 코드 코드는 0-127입니다
• 2 바이트 : 유니 코드는 128-2047입니다
• 3 바이트 : 유니 코드 코드는 2048-0xffff입니다
• 4 바이트 : 유니 코드 코드는 65536-0x1fffff입니다
• 5 바이트 : 유니 코드 코드는 0x200000 -0x3ffffff입니다
• 6 바이트 : 유니 코드 코드는 0x4000000 -0x7ffffff입니다
자세한 내용은 사진을 참조하십시오.
영어 및 영어 문자의 유니 코드 코드는 0-127이기 때문에 유니 코드와 UTF -8의 영어의 길이와 바이트는 동일하며 1 바이트 만 차지합니다. 이것이 UTF8이 유니 코드의 슈퍼 세트 인 이유입니다!
한자의 유니 코드 코드 간격은 0x2E80-0X9FFF이므로 UTF8의 한자의 길이는 최대 3 바이트이기 때문에 한자에 대해 논의 해 봅시다.
그렇다면 한자는 어떻게 2 바이트의 유니 코드에서 3 바이트의 UTF8로 어떻게 변환합니까?
중국어 "中"를 UTF-8 인코딩으로 변환해야한다고 가정합니다.
1. 한자의 유니 코드 값 크기를 얻으십시오
var str = 'in'; var charcode = str.charcodeat (0); console.log (charcode); // => 20013
2. 크기에 따라 UTF8의 길이 판단
이전 단계에서 우리는 중국어 "In"Is 20013의 숯을 얻습니다. 그러면 20013 년은 2048-0xffff 간격에 위치하고 있기 때문에 중국어 "는"UTF8에서 3 바이트를 차지해야합니다.
3. 보완
중국어 "나"가 3 바이트를 차지해야한다는 것을 알고 있기 때문에이 3 바이트를 어떻게 얻을 수 있습니까?
이를 위해서는 보완 코드를 설계해야합니다. 특정 보완 코드 로직은 다음과 같습니다.
좋아, 나는 당신 이이 사진을 이해할 수 없다는 것을 알고 있습니다. 그래서 나는 그것에 대해 이야기 할 것입니다!
특정 채우기 코드는 다음과 같습니다. "X"는 채우기에 사용되는 빈 공간을 나타냅니다.
• 0xxxxxxx
• 110xxxxx 10xxxxxx
• 1110xxxx 10xxxxx 10xxxxxx
• 11110xxx 10xxxxx 10xxxxxx 10xxxxxx
• 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
• 1111110x 10xxxxxx 10xxxxx 10xxxxx 10xxxxxx 10xxxxxx 10xxxxxx
경고 : 찾았습니까? 채우기 코드의 첫 번째 바이트는 전체 UTF-8 코드가 점유하는 바이트 수를 나타냅니다! 이 기능은 UTF-8 디코딩 된 UNICODE ~에 사용됩니다
먼저 간단한 예를 들어 봅시다. 영어 문자 "A"를 UTF8 인코딩으로 변환하십시오.
1. "A"의 숯은 65입니다
2. 65는 0-127 사이의 간격이므로 "A"는 하나의 바이트를 차지합니다.
3. UTF8에서 1 바이트의 보완은 0xxxxxxx입니다. X는 빈 위치를 나타내며 보완에 사용됩니다.
4. 65를 바이너리로 변환하여 1000001을 얻습니다
5. 1xxxxxx의 공석에 1000001을 앞뒤로 추가하고 01000001을 얻으십시오.
6. 11000001을 문자열로 변환하여 "a"를 얻습니다.
마지막으로, "A"는 UTF8에 의해 인코딩됩니다.
이 작은 예를 들어 UTF-8이 유니 코드의 슈퍼 세트임을 다시 확인 했습니까!
좋아, 중국어 "중간"으로 돌아가자. 전에는 20013 년에 "중간"의 숯을 얻었고 바이너리는 010011100 00101101입니다. 세부 사항은 다음과 같습니다.
var code = 20013; code.tostring (2); // => 10011100101은 01001110 00101101과 같습니다
그런 다음 위치를 채우기 위해 위의 "A"를 채우는 방법을 따릅니다.
전면에서 1110xxxxx 10xxxxxx 10xxxxxx로 순서대로 01001110 00101101을 보완하십시오. 11100100 10111000 10101101을 얻으십시오.
4. UTF8 인코딩 된 컨텐츠를 가져옵니다
위의 단계를 통해 "in", 11100100 10111000 1010110101의 3 개의 UTF8 바이트를 얻습니다.
각 바이트를 16 진수로 변환하고 0xe4 0xb8 0xad를 얻습니다.
그런 다음이 0xe4 0xb8 0xad는 우리가 마침내 얻은 UTF8 인코딩입니다.
우리는 Nodejs 버퍼를 사용하여 올바른지 확인합니다.
var 버퍼 = 새 버퍼 ( 'in'); Console.log (buffer.length); // => 3Console.log (버퍼); // => <버퍼 e4 b8 ad> // 마지막으로 3 바이트를 얻습니다 0xe4 0xb8 0xad
16 진수는 사례가 없기 때문에 0xe4 0xb8 0xad를 계산 한 것과 정확히 동일합니까?
위의 인코딩 로직을 함수에 작성하십시오.
// 문자열을 UTF8- 인코딩 바이트로 형식으로 형식 var writeUtf = function (str, isgetBytes) {var back = []; var bytesize = 0; for (var i = 0; i <str.length; i ++) {var code = str.charcodeat (i); if (0x00 <= code && code <= 0x7f) {bytesize += 1; back.push (코드); } else if (0x80 <= code && code <= 0x7ff) {bytesize += 2; back.push ((192 | (31 & (코드 >> 6)))); back.push ((128 | (63 & code))} else if ((0x800 <= code && code <= 0xd7ff) || (0xe000 <= code && code <= 0xffff)) {bytesize += 3; back.push ((224 | (15 & (코드 >> 12))); back.push ((128 | (63 & (코드 >> 6))); back.push (i = 0; i <back.length; i ++) {back [i] & = 0xff; } if (isgetBytes) {return back} if (bytesize <= 0xff) {return [0, bytesize] .concat (back); } else {return [bytesize >> 8, bytesize & 0xff] .concat (back); }} writeUtf ( 'in-on'); // => [0, 3, 228, 184, 173] // 처음 두 자리는 후속 UTF8 바이트의 길이를 나타냅니다. 길이는 3이기 때문에, 처음 두 바이트는`0, 3` // 컨텐츠는`228, 184, 173`이고 16 진수로 변환됩니다. // UTF8에 인코딩 된 바이트를 읽고 유니 코드의 String을 위해 특별히 설계되었습니다. var readutf = function (arr) {if (typeof arr === 'string') {return arr; } var utf = '', _arr = this.init (arr); for (var i = 0; i <_arr.length; i ++) {var one = _arr [i] .toString (2), v = one.match (/^1+? (? = 0)/); if (v && one.length == 8) {var byteslength = v [0] .length; var store = _arr [i] .ToString (2) .Slice (7 -byteslength); for (var st = 1; st <byteslength; st ++) {store += _arr [st +i] .ToString (2) .slice (2)} utf += string.fromcharcode (parseint (store, 2)); i += byteslength -1} else {utf += string.fromcharcode (_arr [i])} return utf} readutf ([0, 3, 228, 184, 173]); => 'in'UTF8 바이트 코드를 얻기 위해 중국어를 구문 분석하는 또 다른 방법
중국어를 UTF8 바이트 코드로 변환하는 또 다른 비교적 간단한 방법은 비교적 간단합니다. 브라우저는 또한 방법을 제공하며 모든 사람 이이 방법을 사용하고 있습니다. 무엇입니까? encodeuri입니다. 물론, 인코 코리 릭 어필도 괜찮습니다.
맞습니다. 그게 방법입니다. 그렇다면이 방법은 유니 코드 인코딩 된 중국어를 UTF8 바이트 코드로 어떻게 변환합니까?
var str = ''; var code = encodeuri (str); console.log (코드); // =>%E4%B8%AD
내가 탈출 한 문자열을 얻었고이 문자열의 내용은 이전에 내가 이전에 얻은 바이트 코드와 동일하다는 것을 알았습니까?
다음으로%E4%B8%AD를 숫자 배열로 변환합니다.
var codelist = code.split ( '%'); codelist = codelist.map (item => parseint (item, 16)); console.log (codelist); // => [228, 184, 173]
너무 간단합니다. ~~~가 있습니다
이 간단한 방법의 원리는 무엇입니까?
URI에서 인코딩하는 문제는 다음과 같습니다. 규정에 따르면 URI의 쿼리 스트링은 UTF8 인코딩에 따라 전송되어야하고 JavaScript는 유니 코드이므로 브라우저는 메소드, 즉 Encodeuri/encodeUricomponent 메소드를 제공합니다. 이 방법은 설명됩니다
영어가 아닌 문자 (이것은 영어가 아닌 문자 인 이유는 무엇입니까?)는 먼저 UTF8 바이트 코드로 변환 된 다음 앞쪽에%를 추가하여 중국어 "中"를 탈출하여 "%e4%B8%AD"를 얻었습니다.
글쎄, 그게 전부 원칙입니다.
그러나이 방법은 또 다른 단점, 즉 영어 이외의 문자 만 피할 수 있으므로 영어 문자를 UTF8 인코딩으로 포맷해야 할 때이 방법은 우리의 요구를 충족시킬 수 없으며 영어 문자를 피해야합니다.
그렇다면 분석하고 싶을 때 어떻게해야합니까? Decodeuri/decodeuricomponent 만 사용하십시오.
var codelist = [228, 184, 173]; var code = codelist.map (item => '%'+item.tostring (16)). join ( ''); decodeuri (코드); // =>
좋아,이 기사에서는 UTF8 인코딩을 소개합니다.
UTF-8 인코딩의 원리를 이해하는 데 도움이되기를 바랍니다.
위의 것은 JavaScript를 통한 UTF-8 인코딩을위한 모든 구현 방법입니다. 모두가 wulin.com을 더 지원하기를 바랍니다