>백엔드 개발 >PHP 튜토리얼 >php_php 기술의 유니코드 및 utf8 인코딩에 대해 간략하게 설명합니다.

php_php 기술의 유니코드 및 utf8 인코딩에 대해 간략하게 설명합니다.

WBOY
WBOY원래의
2016-05-16 20:14:231077검색

유니코드와 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진수 표현을 확인할 수 있습니다

코드 복사 코드는 다음과 같습니다.

문자 => UTF-8 => UTF-8 바이너리 => 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로의 변환을 다시 살펴보세요

코드 복사 코드는 다음과 같습니다.

5B57
5B57이 위치한 유니코드 범위인 0800 <= 5B57 <= FFFF를 가져옵니다. 5B57의 UTF-8에는 1110xxxx 10xxxxxx 10xxxxxx
형식의 3바이트가 있는 것으로 알려져 있습니다. 5B57 101101101010111의 바이너리 인코딩을 가져옵니다
이전 단계의 바이너리 인코딩을 사용하여 UTF-8 인코딩을 오른쪽에서 왼쪽으로 연결합니다. 11100101 10101101 10010111

문제에 대해 이야기하기

오늘 문제의 원인에 대해 이야기해 보겠습니다. 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);

위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.