문자 인코딩 노트 : ASCII, 유니 코드와 UTF-8
텐센트 대학 교실 덕분 NEXT 후원 사이트, 텐센트의 공식 프런트 엔드 과정 무료 평가판 배울 수 있습니다.
오늘 정오에, 나는 갑자기 유니 코드와 UTF-8 사이의 관계를 알아 싶어, 그는 정보를 찾기 시작했다.
이 문제는 내가 점심 21시를 본 후, 상상 속보치을 고려보다 더 복잡하다.
여기에 내 노트는 주로 자신의 아이디어를 구성하는 데 사용됩니다입니다. 나는 다른 친구에게 유용 할 것으로 기대하고, 이해하기 쉽게 작성하려고합니다. 결국, 문자 인코딩이 원하는 컴퓨터 기술, 컴퓨터의 숙련 된 사용의 초석입니다, 당신은 문자 인코딩의 작은 지식을 알아야합니다.
A, ASCII 코드
우리가 알다시피, 내부 컴퓨터는, 모든 정보는 궁극적으로 바이너리 값이다. 각 진 디지트 (비트)을 가지고 0
그리고 1
두 상태, 따라서 8 비트 바이트 (바이트)이라고하는 상태 (256)를 결합 할 수있다. 즉, 한 바이트의 총 256 개 개의 상이한 상태, 심볼에 대응하는 각각의 상태를 나타내는 데 사용될 수있다, 즉 256 개에서 심볼 인 00000000
로 11111111
.
지난 세기의 60 년대, 미국은, 문자 인코딩, 영어 문자와 비트 사이의 관계의 집합을 개발 균일 한 규정을 만들었다. 이것은 여전히 사용, ASCII 코드라고합니다.
ASCII 인코딩 코드 공백 128 개 문자의 합계를 제공하는 단계 SPACE
(32) (이진 00100000
) 대문자 A
65 (이진 01000001
). 128 개 심볼 만이 소정의 균일 한 제일 뒤의 바이트 7 소요 (32 개 제어 심볼을 포함가 출력 될 수 없다) 0
.
둘째, 비 ASCII 코딩
충분히 128 기호 인코딩 영어,하지만 다른 언어를 대표하는, 128 개 기호는 충분하지 않습니다. 예를 들어, 프랑스어, 문자 위의 발음 기호, 그것은 ASCII 코드로 표현 될 수있다. 그 결과, 일부 유럽 국가는 새로운 기호에 통합 대기의 가장 중요한 바이트를 사용하기로 결정했다. 예를 들어, 프랑스 é
130 (이진 코드로 10000010
). 그 결과, 유럽 국가에서 사용하는 코딩 시스템은 256 개 심볼까지 나타낼 수있다.
그러나, 여기에 다시 새로운 문제가있다. 다른 국가들은 인코딩 256 개 문자를 사용하는 경우에도, 문자는 동일하지 않습니다 나타내고, 따라서 서로 다른 문자가 있습니다. 예를 들어, 프랑스 코딩의 130 개 대표 é
, 히브리어 코딩은 문자 표현 Gimel
( ג
다른 대신 서명합니다 러시아 코딩을). 그러나 어떤 경우에, 모든 코드, 기호는 0 ~ 127이 (가) 같은,이 단락에서 동일하지 그냥 128--255입니다 나타냅니다.
텍스트 아시아 국가에 관해서는, 기호는 1000 만 개 한자 많은, 더 많은 사용. 바이트는 문자 256 종류 나타낼 수, 당신이 여러 바이트 상징을 표현 사용해야합니다, 확실히 충분하지 않습니다. 예를 들어, 중국어 간체 인코딩, 문자의 2 바이트를 사용하므로 이론적으로는 256 X 256 = 65536 개 심볼들을 나타내고, 일반적인 GB2312이다.
중국어 코딩 문제는 특별한 요구 사항을 논의,이 메모는 포함되지 않습니다. 여기에만 심볼 바이트 복수하지만 문자 코드로 표현되어 있지만, 이하 GB 클래스 유니 UTF-8과 관련이 있다고 지적했다.
세 가지. 유니 코드
앞의 절에서 언급 한 바와 같이, 이진수로, 세계를 인코딩하는 다양한 서로 다른 상징으로 해석 될 수있다. 따라서, 텍스트 파일을 열기 위해, 당신은 인코딩을 알고, 또는 잘못된 인코딩을 읽는해야한다, 그것은 깨진 것입니다. 왜 전자 우편 종종 왜곡? 발신자와 수신자가 사용하는 부호화 동일하지 않기 때문에.
코드가 있다면, 세상의 모든 기호가 포함되어 상상해보십시오. 각각의 기호는 쓰레기 문제가 사라집니다, 고유 코드가 부여됩니다. 이 이름이 말했듯이,이 모든 기호를 인코딩하고, 유니 코드입니다.
유니 코드는 확실히 만 개 이상의 문자를 수용 할 수있는 현재의 크기의 큰 컬렉션입니다. 각 심볼을 인코딩하는 것은, 예를 들어, 다른 U+0639
아랍어 알파벳 표현 Ain
, U+0041
영어 대문자 A
, U+4E25
중국 문자를 나타냅니다 严
. 특정 기호의 대응 테이블을 조회 할 수 있습니다 Unicode.org 또는 특수 문자 대응 테이블을 .
네, 유니 코드 문제
그것은 유니 코드는 이진 표기법을 제공하고, 단지 기호의 집합이지만,이 바이너리 코드에 저장하는 방법을 지정하지 않습니다 주목해야한다.
예를 들어, 중국어 문자 严
유니 코드는 16 진수입니다 4E25
이진수로 변환, 전체 15 ( 100111000100101
), 즉,이 기호는 적어도 2 바이트를 나타냅니다. 다른 기호 3 바이트 또는 4 바이트, 또는 더 필요할 수 있습니다, 더 큰 나타냅니다.
여기에 두 가지 심각한 문제가 첫 번째 질문은, 거기에 어떻게 할 수있는 유니 코드와 ASCII의 차이점은 무엇입니까? 3 바이트는 세 가지 기호를 표현보다는 기호를 표현하는 방법을 컴퓨터가 알아? 두 번째 문제는 우리가 이미, 유니 코드 규정을 통일하는 경우에만 1 바이트, 각각의 기호는 세 가지 또는 네 개의 바이트로 충분히 표현되는 문자가, 각 문자 앞에 두 개의 행 알고 있다는 것입니다 3 바이트 0
저장을위한 큰 낭비, 텍스트 파일의 크기가 클 것이고, 따라서이 세 번,이 받아 들일 수없는 것입니다.
그들이 야기 결과 : 1) 다양한 바이너리 포맷이있다 유니 저장 수단의 다양한 출현이 유니 코드를 나타 내기 위해 사용될 수있다. 2) 유니 코드는 인터넷의 출현까지 오랜 기간을 올릴 수 없습니다.
다섯, UTF-8
인터넷의 인기는, 통일 된 코드가 나타납니다 촉구했다. UTF-8은 인터넷에서 유니 코드를 사용하여 가장 널리 사용되는 구현입니다. 다른 구현은 또한 실질적으로없는 인터넷, UTF-16 (문자 두 바이트 또는 4 바이트)과 UTF-32 (문자로 나타내는 4 바이트)를 포함하는 방법. 반복, 여기의 관계, UTF-8 유니 코드 구현의 하나입니다.
UTF-8의 가장 큰 특징은 가변 길이 인코딩 것입니다. 이것은 하나 개의 심볼의 1 내지 4 바이트 일 수 있고, 바이트 길이가 기호에 따라 달라진다.
UTF-8 인코딩 규칙은 두 매우 간단합니다 :
1) 단일 바이트 문자의 경우, 첫 번째 바이트가 설정되고 0
, 유니 코드 심볼의이면 (7). 따라서, 영어 알파벳을 위해, UTF-8 인코딩 및 ASCII 코드는 동일합니다.
2) 내용 n
바이트 기호 ( n > 1
) 첫 번째 바이트의 전 n
비트가 설정된 1
상기 n + 1
비트가 설정되어 0
, 처음 두 바이트는 항상 위로 설정 10
. 나머지 비트들은 유니 코드 심볼 모두를 언급하지.
다음 표는 부호화 규칙 문자 요약 x
부호화 비트로 표현한다.
유니 심볼 범위 | UTF-8 인코딩 (16 진수) | (바이너리) -------- + -------- ------------------------------------- 0000 0000-0000 007F | 0xxxxxxx와 0000 0080-0000 07FF | 10xxxxxx에 110xxxxx에 0000 0800-0000 FFFF | 1110xxxx와 10xxxxxx에 10xxxxxx에 0001 0000-0010 FFFF | 11110xxx 10xxxxxx에 10xxxxxx에 10xxxxxx에
이 UTF-8 인코딩을 읽는 것은 매우 간단합니다, 테이블에 지금이다. 첫 번째는 바이트 인 경우 0
, 다음이 단일 바이트 문자는, 첫 번째 경우 1
, 다음 연속의 수는 1
, 현재의 문자가 차지하는 바이트 수를 나타냅니다.
다음은, 중국어 문자 严
, 예를 들어, UTF-8 인코딩을 구현하는 방법을 보여줍니다.
严
유니 코드는 인 4E25
( 100111000100101
) 표에 따라 찾을 수있는 4E25
세 번째 행 (의 범위 0000 0800 - 0000 FFFF
) 따라서 严
UTF-8 인코딩은 3 바이트, 즉 포맷이 필요 1110xxxx 10xxxxxx 10xxxxxx
. 그런 다음에서 严
시작의 마지막 비트, 뒤에서 앞으로의 양식을 작성 x
, 여분의 비트 구성 0
. 따라서, 얻어진 严
코드 UTF-8 11100100 10111000 10100101
16 진수로 변환된다 E4B8A5
.
여섯 간의 변환 유니 코드 UTF-8
이전 섹션의 예함으로써 볼 수있는 严
코드가 유니 코드되어 4E25
, UTF-8 인코딩 E4B8A5
둘이 동일하지 않다. 그들 사이의 전환은 프로그램에 의해 구현 될 수있다.
Windows 플랫폼은 간단한 변환 방법은 내장 된 메모장 애플릿을 사용하는 것입니다있다 notepad.exe
. 파일을 연 후 클릭 文件
메뉴 另存为
가 맨 아래에있는 대화 상자가 나타납니다, 명령 编码
드롭 다운 바.
네 가지입니다 ANSI
옵션 : Unicode
,, Unicode big endian
와 UTF-8
.
1) ANSI
기본 인코딩이다. 영어 파일에 대해 사용 ASCII
인코딩 중국어 간체 파일이됩니다에 대한 GB2312
인코딩 (Windows에서만 중국어 간체, 중국어 버전,이 경우 중국어 번체는 Big5 코드를 사용합니다).
2) Unicode
여기에서 부호화하면 지칭 notepad.exe
직접 2 바이트 엔디안 포맷 옵션이 유니 코드 문자로, 즉 사용하는 UCS-2 인코딩.
3) Unicode big endian
해당 옵션을 인코딩하는 단계를 포함한다. 나는 다음 섹션 빅 엔디안과 리틀 엔디안 의미로 설명 할 것이다.
4) UTF-8
코딩은, 코딩이 논의하는 방법이다.
(가) "코딩", 즉시 더 나은 변환 파일을 인코딩, "저장"버튼을 클릭하여 선택한 후.
세븐, 리틀 엔디안과 빅 엔디안
이미 (코드 포인트 초과하지 않는 이전 섹션에서, UCS-2 형식은 유니 코드를 저장할 수 있습니다 언급 0xFFFF
). 한자 严
예는, 유니 코드는 인 4E25
두 바이트, 1 바이트를 사용할 필요가 4E
다른 바이트 25
. 저장하면, 4E
전, 25
후,이 빅 엔디안 모드이며, 25
전, 4E
후,이 리틀 엔디안 모드입니다.
두 이상한 이름은 영국 작가 조나단 스위프트의에서 온다 "걸리버 여행기." 이 책에서, 내전의 LILLIPUT의 발발, 전쟁이 대부분 (빅 엔디안)에서 기절 또는 작은 머리 (리틀 엔디안) 계란을 먹는 노크 여부를 논쟁의 원인이다. 전쟁이 여섯 번 발발 후, 황제는 그의 목숨을 잃은 전에이 문제에, 또 다른 황제는 자신의 왕위를 잃었다.
첫 번째 바이트는 먼저 "벌크 모드"(빅 엔디안) 첫 번째, 두 번째 바이트가 "머리 모드"(리틀 엔디안)입니다.
당신이 파일의 종류를 사용하여 인코딩 결국 컴퓨터를 아는 방법 : 그래서 당연히 문제가있을 것인가?
명세서에서 정의 유니 코드는 각 파일의 전면 순차적 "제로 폭 비 분리 공간"(영폭 노 체류 공간이라이 글자의 이름의 문자 코드 표현에 부가된다 ) 로 FEFF
도. 이것은 정확히 2 바이트이고 FF
보다 더 FE
큰 1
.
상기 제 2 바이트의 텍스트 파일 인 경우 FE FF
, 파일이 벌크 모드 인 것을 나타내고, 제 2 바이트 인 경우 FF FE
, 그 파일이 작은 머리 형태임을 의미한다.
여덟 예
여기서, 예를 들면.
은 "메모장"프로그램을 열고 notepad.exe
, 새 텍스트 파일을, 내용이 있습니다 严
를 사용하여 다음 단어, ANSI
, Unicode
, Unicode big endian
및 UTF-8
저장 인코딩.
그런 다음, 텍스트 편집기 사용 에 UltraEdit는을 ", 육각 기능"는 파일의 내부 인코딩을 관찰합니다.
1) ANSI 인코딩 된 파일이 두 바이트 D1 CF
이며, 严
부호화 GB2312, GB2312 이것은 또한 대량의 사용이 저장된 것을 의미한다.
2) 유니 : 4 바이트 인코딩 FF FE 25 4E
, FF FE
작은 머리가 저장된 것을 나타낸다을 실제 부호화이다 4E25
.
3) 유니 빅 엔디안 : 4 바이트를 인코딩하는 FE FF 4E 25
, FE FF
대량 저장되는 것을 나타낸다.
4) UTF-8 인코딩 여섯 바이트 EF BB BF E4 B8 A5
상기 제 3 바이트는, EF BB BF
셋,이 UTF-8 인코딩임을 표시 E4B8A5
인 严
특정 코딩 서열 및 코딩 서열은 같은 저장된다.
IX 추가 읽기
- 상기 절대 최소 모든 소프트웨어 개발자. 물론, 긍정적 유니 코드와 문자 집합에 관하여 알아야 (문자 집합의 기본 지식)
- 유니 코드 인코딩에 대해 이야기하려면
- RFC3629 : UTF-8은 ISO 10646 변환의 형식은 (경우에 달성하는 소정 UTF-8)
(끝)