문자, 문자열
문자 집합과 문자 부호화 방식
- 문자란 인간이 '이것은 문자라고 부르자'고 정한 기호 집합에 불과하다. 이 기호 집합을 '문자 집합', '문자 세트' 등으로 부른다. 문자 집합은 나라나 문화에 따라 다르다.
- 한편, 이 문자 집합을 디지털 데이터로 표현하려면 어떻게 부호화할지 정할 필요가 있다. 부호화 방법도 사람이 '이렇게 합시다'라고 정한 규칙에 불과하다. 마음대로 정해버려도 상관없는 것이다.
- 문자 부호화 방법의 역사를 보면 '효율이나 개인적 필요를 위해 부호화 방법을 만들자'는 세력과 '그 방법은 상호간 작업 시에 불편하니 표준화하자'는 세력 간의 치열한 다툼이 있었다.
부호화의 역사
- 모스 부호
- On, Off, 그것의 길이를 조합으로 문자를 표현한다.
- 보 코드
- 하나의 문자를 On/Off 5개의 조합(5비트)으로 표현한다. 많은 문자 표현을 위해 '시프트'를 사용했다. '여기부터 숫자 모드가 시작됩니다'라는 의미의 비트열과 '여기부터 알파벳이 시작됩니다'라는 의미의 비트열을 사용해서 모드 전환을 구현했다.
- 타자기가 전화선에 연결되어 있는 모양(텔레타이프 단말기)으로, 키보드를 눌러 문자를 입력하고(이후에는 펀치테이프에 기술하고 기계가 읽고) 수신자는 수신한 문자를 프린터로 출력한다.
- 이 텔레타이프 단말기가 연결된 국제 통신기가 텔렉스이고, 텔렉스가 사용한 부호화 방법이 보 코드(Baudot code)였다. 1905년에 발명되어 1931년에 표준 규격이 되었다.
- EDSAC 문자 코드
- 1949년에 만들어진 EDSAC이란 컴퓨터도 텔렉스와 같이 한 문자에 5비트를 사용했다.
- ASCII와 EBCDIC의 시대
- EDSAC 이후 10년 간 다양한 컴퓨터가 만들어졌고 문자 부호화 방식도 제각각이었다. 일일이 변환 작업을 해야 하는 수고를 줄이기 위해 컴퓨터가 사용하는 문자 부호화 방법을 표준화하자는 움직임이 일기 시작했다. 그것이 아스키(ASCII, American Standard Code for Information Interchange)로, '정보 교환을 위한 미국 표준 부호'를 의미한다. 1963년에 제정되었다.
- ASCII는 한 문자당 7비트를 사용하는 부호화 방식이다. 하지만 당시 컴퓨터 시장 대부분을 장악하고 있던 IBM이 ASCII와 다른 8비트 부호화 방법을 공개했다. 그것이 EBCDIC이었다.
- Unicode에 의한 통일
- 인터넷이 발전하고 다양한 나라에서 만들어낸 데이터가 교환되기 시작하며 전 세계의 문자를 부호화하는 방법을 만들자는 움직임이 일어났다. 1984년에 국제 표준화 기구가 표준화 작업을 시작했다. 1993년에 Unicode가 국제 표준이 되었다.
- 문자 세트가 통일됐지만, 문자 부호화 방식은 다양한 필요에 의해 몇 가지 종류가 만들어지게 되었다. UTF-7이나 UTF-6 등이 그 예다.
- 문자 부호화 방식에 따라 컴퓨터의 성능이 영향 받기 때문에 다양한 방식이 만들어졌다.
문자열이란?
문자열이란 문자가 정렬해있는 것이다. 문자열에는 여러 가지 고려해야 할 점이 있다.
- 무엇이 문자인지 → 문자 집합
- 어떻게 문자를 비트열로 표현하는지 → 문자 부호화 방식
- 어떤 정보를 어떤 메모리에 저장하는지 → 문자열 구현
문자에 따라 문자열을 표현하는 방법은 언어마다 제각각이다.
- C와 Pascal
- 모두 하나의 문자를 8비트로 정의한다.
- Pascal은 제일 앞 부분에 문자열 길이를 기록해둔다는 규칙을 채용하고 있다. 대부분 언어에서 Pascal 식의 문자열을 채택하고 있다.
- C 언어 문자열은 문자열이 시작되는 메모리 상의 위치만을 가지고 있다. 문자열의 끝을 표현하는 특별한 문자(NUL)를 사용한다. 즉, C언어에서는 '선두에서부터 차례대로 읽어서 제일 처음 NUL 문자가 나오는 곳까지'를 문자열로 인식한다.
- Java
- 문자열이 길이 정보를 가지고 있다.
- char 형이 16비트로 정해져 있다. Java의 문자란 '16비트로 표현할 수 있는 Unicode의 문자'이다.
- Python
- 2버전에서는 '바이트열이 ASCII 범위에 포함되면 ASCII로 간주하고 자동으로 Unicode로 변환'하는 설계로 되어 있었다. 하지만 이 설계는 문자열의 내용에 따라 에러가 되거나 되지 않거나 한다. ASCII 이외의 문자를 사용하고 있는 나라에서는 문제가 발생하게 된다.
- 따라서 Python 3 버전부터는 이전 버전과의 호환성을 버리고 문자열 관련 부분을 크게 고쳤다. 그냥 아무 조작 없이 문자를 쓰면 Unicode 문자열이 되고,
b
를 문자열 앞에 추가해 쓰면 바이트열이 되도록 변경하여 Unicode쪽을 보다 손쉽게 사용할 수 있도록 했다. - 또한 Python 3 에서 Unicode 문자열과 바이트열을 결합하면 무조건 에러가 발생하게 된다. 섞어 쓰고 싶을 때는 프로그래머가 명시적으로 변환 코드를 써야 한다.
- Ruby
- Rudy는 1.9버전부터 문자열은 8비트로 하고 '부호화 방식 정보'를 추가로 보유하도록 했다. 이 방법의 장점은 Unicode 문자 집합에 포함되지 않는 문자를 손쉽게 쓸 수 있다는 것이다.
- 그림문자와 Google과 Apple
- 핸드폰용 웹 서비스를 만들어서 핸드폰 제조사가 각자 독자적으로 만든 그림 문자를 상호 간에 교환하는 경우가 있다. 이 때 발생하는 문제를 해결하기 위해 Google과 Apple은 Ruby 1.9와 같은 방식이 아니라, 유니코드 컨소시엄에 '핸드폰에서 사용하고 있는 그림 문자를 문자 집합에 포함시키자'고 제안했다. 2010년에 공개된 Unicode 6.0에서 수백 개의 그림 문자가 추가되었다.
참고 자료 및 출처
- 책 <코딩을 지탱하는 기술> 9장 컨테이너와 문자열
- 문자 인코딩이란?
'일반' 카테고리의 다른 글
처음으로 API를 mocking하여 단위 테스트를 작성한 날 (0) | 2022.10.12 |
---|---|
노마드코더 CSS Layout 코스 & 챌린지 후기 (0) | 2021.01.26 |
2021년 블로그의 방향 (0) | 2021.01.04 |
카카오 OPEN API, KAKAO POSE(카카오 포즈) 사용해보기 (0) | 2020.12.24 |
[부스트코스] 모두를 위한 컴퓨터 과학 (CS50 2019) | 하드웨어의 한계 (0) | 2020.07.08 |