유니코드 및 utf8 인코딩 다시 이해

WBOY
풀어 주다: 2016-08-08 09:23:57
원래의
1106명이 탐색했습니다.

유니코드와 utf8 인코딩 재인식


정확히 말하면 오늘까지만 해도 UTF-8 인코딩과 유니코드 인코딩이 다르다는 사실을 몰랐는데 차이점이 있습니다
그들 사이에는 특정한 연관성이 있습니다. 차이점을 살펴보세요.

<code>UTF-8的长度是不一定的,有可能是1、2、3字节
Unicode长度一定,2个字节(USC-2)
UTF-8可以和Unicode互相转换</code>
로그인 후 복사

유니코드와 utf8의 관계


Unicode(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비트가 충분하지 않으면 왼쪽을 사용하지 마세요. 2바이트와 16비트는 UTF-8에 해당하는 유니코드 인코딩을 나타냅니다.


유니코드 및 utf8 인코딩 다시 이해위 그림에서 텍스트 인코딩 형식은 UTF-8이며 WinHex를 사용하여 16진수 표현을 볼 수 있습니다

<code>字符	=> UTF-8	  => UTF-8二进制=> 去掉固定位置凑够16位的二进制 => 16进制

汉 	=> E6B189 => 11100110 10110001 10001001	=> 01101100 01001001 => 6C49
汉 	=> E5AD97 => 11100101 10101101 10010111	=> 01011011	01010111 => 5B57

#下面是在chrome命令行下面运行的结果
'\u6C49'
"汉"
'\u5B57'
"字"

#到这里的话,从UTF-8转换到Unicode已经是一件非常容易的事了,看看转换的伪代码
读取一个字节,11100110
判断该UTF-8字符的格式,属于第三种,3个字节
继续读取2个字节得到 11100101 10101101 10010111
按照格式去掉固定位     1011011 01010111
不够16位,左边补零    01011011 01010111  => 5B57</code>
로그인 후 복사
유니코드에서 UTF-8로의 변환을 살펴보겠습니다
<code>5B57
获取5B57所在的Unicode范围,0800 <= 5B57 <= FFFF,得知5B57的UTF-8有三个字节,形式为1110xxxx 10xxxxxx 10xxxxxx
获取5B57的二进制编码 101101101010111
用上一步骤的二进制编码从右至左拼接UTF-8编码 11100101 10101101 10010111 </code>
로그인 후 복사
문제


오늘 문제의 원인에 대해 이야기해보겠습니다. UTF-8 형식의 단어 하나당 최대 30바이트이므로 검증이 필요합니다. 프론트엔드와 백엔드에서 별도로 진행됩니다. 자바스크립트는 유니코드 인코딩을 사용하며, 백엔드 프로그램은 UTF-8 인코딩을 사용합니다.

프론트엔드
<code>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</code>
로그인 후 복사
백엔드
<code>#对于GBK字符串
$len = ceil(strlen(bin2hex(iconv('GBK', 'UTF-8', $word)))/2);
#对于UTF8字符串
$len = ceil(strlen(bin2hex($word))/2);</code>
로그인 후 복사
5/21/2015 8:21:53 PM

이 글의 저작권은 작성자에게 있습니다. iforever (luluyrt@ 163.com) 저자의 동의 없이는 어떠한 형태의 재인쇄도 금지됩니다. 기사를 재인쇄한 후에는 기사 페이지에 위치를 명시하고 원본 텍스트 링크를 명시해야 합니다. 법적 책임을 추구합니다.

위 내용은 내용의 측면을 포함하여 유니코드와 utf8 인코딩에 대한 재이해를 소개하며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!