유니코드와 utf8 인코딩 다시 이해
오늘까지만 해도 엄밀히 말하면 UTF-8 인코딩과 유니코드 인코딩이 다른지 몰랐는데 차이가 있네요 囧
그들 사이에는 어떤 연관성이 있습니다. 차이점을 살펴보세요.
UTF-8의 길이는 확실하지 않으며 1, 2, 3바이트일 수 있습니다.
유니코드의 길이는 2바이트(USC-2)입니다.
UTF-8은 유니코드 간 변환이 가능합니다
유니코드와 utf8의 관계
유니코드(16)
UTF-8(바이너리)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
위 표에는 두 가지 의미가 있습니다. 첫 번째는 분명히 유니코드와 UTF-8 문자 범위 간의 대응이고, 다른 하나는 유니코드와 UTF-8이 어떻게 서로 변환되는지 보여줍니다.
먼저 UTF-8에서 유니코드로의 변환에 대해 이야기해 보겠습니다
UTF-8로 인코딩된 바이너리는 위의 세 가지 형식과 일치한 후 고정 비트(테이블에서 x가 아닌 위치)가 제거된 다음 8비트마다 오른쪽에서 왼쪽으로 그룹화됩니다. 8비트가 충분하지 않으면 왼쪽은 사용되지 않습니다. 이 16비트는 UTF-8에 해당하는 유니코드 인코딩을 나타냅니다.
위 그림의 텍스트 인코딩 형식은 UTF-8이며, WinHex를 사용하여 16진수 표현을 확인할 수 있습니다
중국어 => E6B189 => 11100110 10110001 10001001 => 01101100 01001001
워드 => E5AD97 => 11100101 10101101 10010111 => 01011011 01010111 => 5B57
#다음은 크롬 명령줄에서 실행한 결과입니다
'u6C49'
"汉"
'u5B57'
"단어"
#이 시점에서 UTF-8을 유니코드로 변환하는 것은 이미 매우 쉬운 작업입니다. 변환의 의사코드를 살펴보세요
1바이트 읽기, 11100110
세 번째 유형인 3바이트에 속하는 UTF-8 문자의 형식을 결정합니다.
11100101 10101101 10010111을 얻으려면 2바이트를 계속 읽으세요
1011011 01010111
형식에 따라 고정 비트를 제거합니다.
16자리가 부족합니다. 왼쪽에 0을 추가하세요. 01011011 01010111 => 5B57
유니코드에서 UTF-8로의 변환을 다시 살펴보세요
문제에 대해 이야기하기
오늘 문제의 원인에 대해 이야기해 보겠습니다. UTF-8 형식의 각 단어는 최대 30바이트이므로 JavaScript를 사용하는 프런트 엔드에서 각각 확인이 이루어집니다. 유니코드 인코딩과 백엔드 프로그램인 UTF-8 인코딩을 사용하고 있으며, 현재 해결방법은 다음과 같습니다
프런트엔드
function utf8_bytes(str) { var len = 0, unicode; for(var i = 0; i < str.length; i++) { unicode = str.charCodeAt(i); if(unicode < 0x0080) { ++len; } else if(unicode < 0x0800) { len += 2; } else if(unicode <= 0xFFFF) { len += 3; }else { throw "characters must be USC-2!!" } } return len; } #例子 utf8_bytes('asdasdas') 8 utf8_bytes('yrt燕睿涛') 12
백스테이지
#对于GBK字符串 $len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2); #对于UTF8字符串 $len = ceil(strlen(bin2hex($word))/2);
위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.