문자 인 코딩 노트 ASCII,Unicode,UTF-8
8559 단어 문자 인 코딩
컴퓨터 내부 에서 모든 정 보 는 최종 적 으로 바 이 너 리 문자열 로 표시 된다 는 것 을 잘 알 고 있 습 니 다.각 이 진 비트(bit)는 0 과 1 두 가지 상태 가 있 기 때문에 8 개의 이 진 비트 는 256 가지 상 태 를 조합 할 수 있 는데 이것 은 하나의 바이트(byte)라 고 불 린 다.즉,하나의 바이트 가 모두 256 가지 서로 다른 상 태 를 나타 내 는 데 사용 할 수 있 고 모든 상태 가 하나의 기호 에 대응 하 는 것 은 256 개의 기호 로 000000 에서 11111111 까지 이다.
1960 년대 에 미국 은 문자 인 코딩 을 제정 하여 영어 문자 와 바 이 너 리 간 의 관 계 를 통일 적 으로 규정 했다.ASCII 코드 라 고 불 리 며 지금까지 사용 되 고 있다.
ASCII 코드 는 모두 128 글자 의 인 코딩 을 규정 하고 있 습 니 다.예 를 들 어 빈 칸 인'SPACE'는 32(바 이 너 리 00100000)이 고 대문자 A 는 65(바 이 너 리 01000001)입 니 다.이 128 개의 기호(인쇄 할 수 없 는 제어 기호 32 개 포함)는 한 바이트 의 뒤쪽 7 자리 만 차지 하고 맨 앞의 1 자 리 는 0 으로 통일 되 어 있다.
2.비 ASCII 인 코딩
영 어 는 128 개의 기호 로 인 코딩 하면 충분 하지만 다른 언어 를 나타 내 는 데 128 개의 기호 가 부족 하 다.예 를 들 어 프랑스어 에서 자모 위 에 주음 기호 가 있 으 면 ASCII 코드 로 표시 할 수 없다.그래서 일부 유럽 국가 들 은 바이트 에 남아 있 는 최고 위 치 를 이용 해 새로운 기 호 를 만 들 기로 했다.예 를 들 어 프랑스어 에 있 는 에 의 인 코딩 은 130(2 진법 1000010)이다.이렇게 되면 이들 유럽 국가 가 사용 하 는 인 코딩 체 계 는 최대 256 개의 기 호 를 나 타 낼 수 있다.
하지만 여기에 또 새로운 문제 가 생 겼 다.나라 마다 알파벳 이 다 르 기 때문에 256 개의 기 호 를 사용 하 더 라 도 대표 적 인 알파벳 은 다르다.예 를 들 어 130 은 프랑스어 인 코딩 에서 에 를 대표 하고 히 브 리 어 인 코딩 에서 알파벳 Gimel(ג),러시아어 인 코딩 에서 또 다른 기 호 를 대표 할 것 이다.그러나 어쨌든 이 모든 인 코딩 방식 에서 0-127 이 나타 내 는 기 호 는 같 고 다른 것 은 128-255 의 이 부분 에 불과 하 다.
아시아 국가의 문자 에 대해 사용 하 는 기호 가 더 많아 지고 한 자 는 10 만 정도 에 달한다.한 바이트 가 256 가지 기호 만 표시 할 수 있 고 부족 할 것 이 므 로 여러 개의 바이트 로 하나의 기 호 를 표현 해 야 한다.예 를 들 어 간 체 중국어 에서 흔히 볼 수 있 는 인 코딩 방식 은 GB 2312 이 고 두 개의 바이트 로 한 자 를 표시 하기 때문에 이론 적 으로 최대 256 x256=65536 개의 기 호 를 나 타 낼 수 있다.
중국어 인 코딩 문 제 는 전문 적 인 토론 이 필요 하 며,이 필 기 는 언급 되 지 않 는 다.여기 에는 모두 하나의 부 호 를 여러 바이트 로 표시 하지만 GB 류 한자 인 코딩 은 후문 의 유 니 코드 나 UTF-8 과 는 아무런 관계 가 없다 는 점 만 지적한다.
3.Unicode
앞에서 말 한 바 와 같이 세계 에는 여러 가지 인 코딩 방식 이 존재 하 는데 같은 바 이 너 리 숫자 는 서로 다른 기호 로 해석 할 수 있다.따라서 텍스트 파일 을 열 려 면 인 코딩 방식 을 알 아야 합 니 다.그렇지 않 으 면 잘못된 인 코딩 방식 으로 해석 하면 오류 가 발생 합 니 다.왜 이메일 에 자주 오류 가 발생 합 니까?발신 자 와 수신 자가 사용 하 는 인 코딩 방식 이 다 르 기 때문이다.
하나의 인 코딩 이 있다 면 세계 의 모든 기 호 를 그 안에 포함 시 킬 것 이 라 고 상상 할 수 있다.모든 기호 가 하나 밖 에 없 는 인 코딩 을 해 주면 어 지 러 운 문 제 는 사라 진다.이것 이 바로 유 니 코드 입 니 다.이름 이 모두 표시 하 는 것 처럼 모든 기호의 인 코딩 입 니 다.
유 니 코드 는 당연히 매우 큰 집합 으로 현재 의 규 모 는 100 여 만 개의 기 호 를 수용 할 수 있다.기호 마다 인 코딩 이 다르다.예 를 들 어 U+0639 는 아라비아 자모 Ain 을 나타 내 고 U+0041 은 영 어 를 나타 내 는 대문자 A 를 나타 내 며 U+4E 25 는 한자 가'엄격 하 다'는 것 을 나타 낸다.구체 적 인 기호 대응 표 는 조회unicode.org또는 전문 적 인한자 대응 표를 할 수 있다.
4.유 니 코드 의 질문
주의해 야 할 것 은 유 니 코드 는 기호 집합 일 뿐 기호의 바 이 너 리 코드 만 규정 하고 이 바 이 너 리 코드 를 어떻게 저장 해 야 하 는 지 규정 하지 않 았 다 는 것 이다.
예 를 들 어 한자'엄'의 유 니 코드 는 16 진수 4E 25 로 이 진수 로 전환 하면 무려 15 비트(10011000100101)가 있다.즉,이 기호의 표 시 는 적어도 2 개의 바이트 가 필요 하 다 는 것 이다.다른 더 큰 기 호 를 나타 내 는데 3 개의 바이트 나 4 개의 바이트,심지어 더 필요 할 수도 있다.
여기 에는 두 가지 심각 한 문제 가 있 습 니 다.첫 번 째 문 제 는 유 니 코드 와 ascii 를 어떻게 구별 할 수 있 습 니까?컴퓨터 는 세 개의 바이트 가 하나의 기 호 를 표시 하 는 것 이지 각각 세 개의 기 호 를 표시 하 는 것 이 아니 라 는 것 을 어떻게 알 았 습 니까?두 번 째 문 제 는 영문 자모 가 한 바이트 로 만 표시 하면 된다 는 것 을 이미 알 고 있다 는 것 이다.만약 에 유 니 코드 가 통일 적 으로 규정 하면 모든 기호 가 세 개 또는 네 개의 바이트 로 표시 하면 모든 영문 자모 앞 에 반드시 두 세 개의 바이트 가 0 이 될 것 이다.이것 은 저장 에 있어 매우 큰 낭비 이 고 텍스트 파일 의 크기 가 이 로 인해 두 세 배 나 클 것 이다.이것 은 받 아들 일 수 없다.
이 로 인 한 결 과 는 1)유 니 코드 의 다양한 저장 방식 이 나 타 났 다.즉,유 니 코드 를 표시 할 수 있 는 다양한 바 이 너 리 형식 이 있다 는 것 이다.2)유 니 코드 는 인터넷 이 등장 할 때 까지 오랫동안 홍보 할 수 없다.
5.UTF-8
인터넷 의 보급 은 통 일 된 인 코딩 방식 이 나타 날 것 을 강력 히 요구한다.UTF-8 은 인터넷 에서 가장 광범 위 하 게 사용 되 는 유 니 코드 의 실현 방식 이다.다른 실현 방식 은 UTF-16 과 UTF-32 도 포함 되 지만 인터넷 에 서 는 거의 사용 되 지 않 는 다.다시 한 번 말씀 드 리 지만 이곳 의 관 계 는 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 는 인 코딩 가능 한 위 치 를 표시 합 니 다.
Unicode | UTF-8
( ) | ( )
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
다음은 한자'엄'을 예 로 들 어 UTF-8 인 코딩 을 어떻게 구현 하 는 지 보 여 준다.'엄격 함'을 알 고 있 는 유 니 코드 는 4E 25(10011000100101)로 위의 표 에 따 르 면 4E 25 가 세 번 째 줄 의 범위 내(0000 0800-0000 FFFF)에 있 는 것 을 발견 할 수 있 기 때문에'엄격 함'의 UTF-8 인 코딩 은 세 개의 바이트 가 필요 하 다.즉,형식 은'1110 xxxx 10xxxxx 10xxxxx'이다.그 다음 에'엄'의 마지막 바 이 너 리 부터 차례대로 뒤에서 형식의 x 를 채 우 고 더 많은 비트 를 0 으로 보충 합 니 다.이렇게 해서'엄'의 UTF-8 인 코딩 은'11100100 10111000 101001001'이 고 16 진법 으로 전환 하면 E4B8A 5 이다.
6.유 니 코드 와 UTF-8 간 의 전환
지난 절의 예 를 들 어'엄격 하 다'는 유 니 코드 코드 는 4E 25,UTF-8 인 코딩 은 E4B8A5 로 둘 이 다르다 는 것 을 알 수 있다.그들 사이 의 전환 은 프로그램 을 통 해 이 루어 질 수 있다.
Windows 플랫폼 에서 가장 간단 한 전환 방법 은 내 장 된 메모 장 애플 릿 Notepad.exe 를 사용 하 는 것 입 니 다.파일 을 열 고'파일'메뉴 의'다른 이름 으로 저장'명령 을 누 르 면 대화 상자 가 나 옵 니 다.맨 밑 에'인 코딩'의 하단 이 있 습 니 다.
안 에는 네 가지 옵션 이 있 습 니 다.ANSI,Unicode,Unicode big endian,UTF-8.
1)ANSI 는 기본 인 코딩 방식 입 니 다.영어 파일 은 ASCII 인 코딩 이 고 간 체 중국어 파일 은 GB 2312 인 코딩 입 니 다.
2)유 니 코드 인 코딩 은 두 바이트 로 문 자 를 직접 저장 하 는 유 니 코드 인 UCS-2 인 코딩 방식 을 말한다.이 옵션 은 little endian 형식 을 사용 합 니 다.
3)유 니 코드 big endian 인 코딩 은 이전 옵션 과 대응 합 니 다.나 는 다음 절 에 little endian 과 big endian 의 의 미 를 설명 할 것 이다.
4)UTF-8 인 코딩,즉 지난 절 에 언급 한 인 코딩 방법 이다.
'인 코딩 방식'을 선택 한 후'저장'단 추 를 누 르 면 파일 의 인 코딩 방식 이 바로 바 뀝 니 다.
7.Little endian 과 Big endian
유 니 코드 코드 는 UCS-2 형식 으로 직접 저장 할 수 있다 고 지난 절 에서 언급 했다.한자'엄'의 경우 유 니 코드 코드 는 4E 25 로 두 바이트 로 저장 해 야 하 며,한 바 이 트 는 4E,다른 바 이 트 는 25 다.저장 할 때 4E 가 앞 에 있 고 25 가 뒤에 있 으 면 Big endian 방식 입 니 다.25 는 앞 에 있 고 4E 는 뒤에 있 으 며 Little endian 방식 이다.
이 두 개의 기괴 한 명칭 은 영국 작가 스 위 프 트 의《걸 리 버 여행기》에서 나 왔 다.이 책 에서 소인국 에서 내전 이 일 어 났 는데,전쟁의 원인 은 달걀 을 먹 을 때 큰 머리(Big-Endian)에서 두 드 렸 는 지 작은 머리(Little-Endian)에서 두 드 렸 는 지 에 대한 논쟁 이 었 다.이 일 을 위해 전후 여섯 차례 의 전쟁 이 일 어 났 고 한 황 제 는 목숨 을 잃 었 고 다른 황 제 는 왕 위 를 잃 었 다.
따라서 첫 번 째 바이트 가 앞 에 있 으 면'큰 머리 방식'(Big endian)이 고,두 번 째 바이트 가 앞 에 있 으 면'작은 머리 방식'(Little endian)이다.
그러면 자 연 스 럽 게 문제 가 발생 할 것 이다.컴퓨터 는 어떤 파일 이 도대체 어떤 방식 으로 인 코딩 을 하 는 지 어떻게 알 수 있 습 니까?
유 니 코드 규범 에 따 르 면 모든 파일 의 맨 앞 에 인 코딩 순 서 를 나타 내 는 문 자 를 추가 합 니 다.이 문자 의 이름 은'0 너비 비 줄 빈 칸'(ZERO WIDTH NO-BREAK SPACE)이 고 FEFF 로 표시 합 니 다.이것 은 딱 두 개의 바이트 이 고 FF 는 FE 보다 1 크다.
만약 텍스트 파일 의 첫 두 바이트 가 FE FF 라면 이 파일 은 큰 머리 방식 을 사용 한 다 는 것 을 나타 낸다.첫 두 바이트 가 FF FE 라면 이 파일 은 작은 머리 방식 을 사용 한 다 는 뜻 이다.
8.실례
다음은 실례 를 하나 들 겠 습 니 다.
'메모 장'프로그램 Notepad.exe 를 열 고 텍스트 파일 을 새로 만 듭 니 다.내용 은'엄'자 입 니 다.ANSI,Unicode,Unicode big endian,UTF-8 인 코딩 으로 순서대로 저 장 됩 니 다.
그 다음 에 텍스트 편집 소프트웨어UltraEdit 중의'16 진 기능'으로 이 파일 의 내부 인 코딩 방식 을 관찰 합 니 다.
1)ANSI:파일 의 인 코딩 은 바로 두 바이트 의'D1 CF'입 니 다.이것 은 바로'엄격 한'GB 2312 인 코딩 입 니 다.이것 은 GB 2312 가 큰 머리 방식 으로 저장 되 었 음 을 암시 합 니 다.
2)유 니 코드:인 코딩 은 네 개의 바이트 인'FF FE 25 4E'인 데 그 중에서'FF FE'는 작은 머리 방식 으로 저장 되 고 진정한 인 코딩 은 4E 25 임 을 나타 낸다.
3)유 니 코드 빅 엔 디 언:인 코딩 은 네 개의 바이트 인'FE FF 4E 25'인 데 그 중에서'FE FF'는 큰 머리 방식 으로 저 장 된 것 을 나타 낸다.
4)UTF-8:인 코딩 은 6 개의 바이트 인'EF BB BF E4 B8 A5'이 고,앞의 3 개의 바이트 인'EF BB BF'는 UTF-8 인 코딩 이 며,뒤의 3 개의'E4B8A 5'는'엄격 함'의 구체 적 인 인 인 코딩 이 며,그 저장 순 서 는 인 코딩 순서 와 일치한다.
9.연장 읽 기
*The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets(문자 집합 에 대한 기본 지식)
* 유 니 코드 코드 얘 기 좀 해 봐.
*RFC3629:UTF-8, a transformation format of ISO 10646(UTF-8 규정 이 실현 되면)
(끝)