[게시물] 문자 인코딩 노트 : ASCII, 유니 코드 UTF-8 및

문자 인코딩 노트 : ASCII, 유니 코드와 UTF-8

저자 :  루안 이풍

날짜 :  2007 10월 28일

 

오늘 정오에, 나는 갑자기 유니 코드와 UTF-8 사이의 관계를 알아 싶어, 그는 정보를 찾기 시작했다.

이 문제는 내가 점심 21시를 본 후, 상상 속보치을 고려보다 더 복잡하다.

여기에 내 노트는 주로 자신의 아이디어를 구성하는 데 사용됩니다입니다. 나는 다른 친구에게 유용 할 것으로 기대하고, 이해하기 쉽게 작성하려고합니다. 결국, 문자 인코딩이 원하는 컴퓨터 기술, 컴퓨터의 숙련 된 사용의 초석입니다, 당신은 문자 인코딩의 작은 지식을 알아야합니다.

A, ASCII 코드

우리가 알다시피, 내부 컴퓨터는, 모든 정보는 궁극적으로 바이너리 값이다. 각 진 디지트 (비트)을 가지고 0그리고 1두 상태, 따라서 8 비트 바이트 (바이트)이라고하는 상태 (256)를 결합 할 수있다. 즉, 한 바이트의 총 256 개 개의 상이한 상태, 심볼에 대응하는 각각의 상태를 나타내는 데 사용될 수있다, 즉 256 개에서 심볼 인 0000000011111111.

지난 세기의 60 년대, 미국은, 문자 인코딩, 영어 문자와 비트 사이의 관계의 집합을 개발 균일 한 규정을 만들었다. 이것은 여전히 ​​사용, ASCII 코드라고합니다.

ASCII 인코딩 코드 공백 128 개 문자의 합계를 제공하는 단계 SPACE(32) (이진 00100000) 대문자 A65 (이진 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 1010010116 진수로 변환된다 E4B8A5.

여섯 간의 변환 유니 코드 UTF-8

이전 섹션의 예함으로써 볼 수있는 코드가 유니 코드되어 4E25, UTF-8 인코딩 E4B8A5둘이 동일하지 않다. 그들 사이의 전환은 프로그램에 의해 구현 될 수있다.

Windows 플랫폼은 간단한 변환 방법은 내장 된 메모장 애플릿을 사용하는 것입니다있다 notepad.exe. 파일을 연 후 클릭 文件메뉴 另存为가 맨 아래에있는 대화 상자가 나타납니다, 명령 编码드롭 다운 바.

bg2007102801.jpg

네 가지입니다 ANSI옵션 : Unicode,, Unicode big endianUTF-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보다 더 FE1.

상기 제 2 바이트의 텍스트 파일 인 경우 FE FF, 파일이 벌크 모드 인 것을 나타내고, 제 2 바이트 인 경우 FF FE, 그 파일이 작은 머리 형태임을 의미한다.

여덟 예

여기서, 예를 들면.

은 "메모장"프로그램을 열고 notepad.exe, 새 텍스트 파일을, 내용이 있습니다 를 사용하여 다음 단어, ANSI, Unicode, Unicode big endianUTF-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 추가 읽기

(끝)

추천

출처www.cnblogs.com/jinanxiaolaohu/p/11250042.html