문자 (컴퓨팅)
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
문자(컴퓨팅)는 컴퓨터 및 통신 장비에서 텍스트를 표현하기 위해 사용되는 개념으로, 각 문자는 숫자 값에 할당되어 저장, 전송된다. 문자 인코딩 방식으로는 아스키, 유니코드의 UTF-8 등이 있으며, 문자는 도형 문자(화면에 표시)와 제어 문자(표시 방식 제어)로 구분된다. C/C++에서는 char 자료형을 사용하지만, 유니코드 지원을 위해 wchar_t, char16_t, char32_t 등의 자료형이 추가되었다. 유니코드는 다양한 문자 집합을 통합하여 문자 간의 호환성을 높였으며, 문자, 코드화된 문자, 글리프 등의 개념을 정의한다. 초창기 컴퓨터에서는 텔레타이프, 천공 카드 등의 입출력 장치에서 문자를 표현했으며, 캐릭터 디스플레이 방식을 통해 텍스트를 표시했다. 프로그래머블 문자 생성기(PCG)는 램에 문자 패턴을 저장하여 화면을 동적으로 변경하는 데 사용되었다.
더 읽어볼만한 페이지
- 원시 자료형 - 참조
참조는 프로그래밍에서 메모리 주소나 다른 데이터를 가리키는 값으로, 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다. - 원시 자료형 - 문자열
문자열은 사람이 읽을 수 있는 텍스트를 저장하고 정보를 전달하거나 받는 데 사용되는 순서가 있는 문자들의 시퀀스로, 다양한 형태의 데이터를 표현하며 유한한 길이를 가지고, 프로그래밍 언어에서 기본 또는 복합 자료형으로 제공되고, 문자 집합과 인코딩 방식에 따라 표현 방식이 달라진다. - 디지털 타이포그래피 - 점자
점자는 루이 브라이유가 개발한 시각 장애인용 촉각 문자 체계로, 6점 점자를 사용하여 133개 이상의 언어에 적용되었으며, 교육, 정보 접근, 사회 참여에 필수적인 역할을 수행하지만 문해력 저하와 교육의 어려움이라는 과제도 안고 있다. - 디지털 타이포그래피 - 포스트스크립트
어도비 시스템즈에서 개발한 포스트스크립트는 페이지 기술 언어이자 튜링 완전한 프로그래밍 언어로서, 데스크톱 출판 혁명을 이끌고 인쇄 기술 발전에 기여했으며, PDF 형식의 기반이 되었다. - 문자 인코딩 - 유니코드
유니코드는 세계의 모든 문자를 하나의 컴퓨터 인코딩 표준으로 통합하기 위해 설계되었으며, 유니코드 컨소시엄에 의해 관리되고 UTF-8, UTF-16, UTF-32 등의 부호화 형식을 제공하지만, 일부 문자 표현 문제, 버전 간 비호환성, 레거시 인코딩과의 호환성 문제 등의 과제를 안고 있다. - 문자 인코딩 - UTF-8
UTF-8은 유니코드 문자를 표현하는 가변 길이 문자 인코딩 방식으로, ASCII 코드와 호환성을 유지하며 다양한 언어의 문자를 표현할 수 있도록 설계되었지만, 보안 문제점과 공간 효율성 측면에서 단점을 가진다.
문자 (컴퓨팅) |
---|
2. 문자 인코딩
컴퓨터 및 통신 장비는 각 문자를 비트로 표현되는 정수 값에 할당하는 문자 인코딩을 이용하여 문자를 표현한다. 대표적인 예로 아스키와 유니코드를 위한 UTF-8이 있다.[1]
역사적으로 "문자"라는 용어는 업계 전문가들이 프로그래밍 언어나 API에 의해 정의된 "인코딩된 문자"를 지칭하기 위해 널리 사용해 왔다. 마찬가지로, "문자 집합"은 특정 비트 시퀀스 또는 숫자 코드에 매핑된 특정 문자 집합을 지칭하는 데 사용되었다. 글리프는 문자의 특정 시각적 모양을 설명하는 데 사용된다. 많은 컴퓨터 글꼴은 해당 문자의 숫자 코드로 인덱싱되는 글리프로 구성된다.
컴퓨터와 통신 장비는 문자 인코딩을 통해 문자를 숫자로 표현되는 정수 값으로 나타내며, 이는 저장되거나 네트워크를 통해 전송될 수 있다. 대부분의 문자 인코딩은 문자를 숫자나 비트 시퀀스에 매핑하지만, 모스 부호는 다양한 길이의 전기적 임펄스를 사용하여 문자를 나타낸다.[2]
컴퓨터의 정보 교환에서 텍스트 데이터를 주고받을 때, 양측은 사용할 문자 집합을 정하고 통신한다. 이 때 문자는 최소 단위이다.[3]
현재 문자와 데이터의 관계는 추상화되어 있다. 문자는 정수 값(일반적으로 음수가 아닌 정수)으로 표현되며, 문자 인코딩에 의해 이 정수 값으로부터 바이트열이 생성된다. 예를 들어 유니코드에서는 각 문자에 유니코드 스칼라 값이 부여된다.[4]
3. 용어
ISO/IEC 10646 (유니코드) 국제 표준은 "문자" 또는 "추상 문자"를 "데이터의 구성, 제어 또는 표현에 사용되는 요소 집합의 구성원"으로 정의한다. 유니코드의 정의는 독자가 문자, 그래프 및 글리프 등을 구별하도록 장려하는 설명 참고 사항으로 이를 보완한다.
예를 들어, 히브리 문자 알레프("א")는 수학자들이 특정 종류의 알레프 수 (ℵ)를 나타내는 데 사용되지만, 일반 히브리 텍스트에서도 사용된다. 유니코드에서 이 두 가지 용도는 서로 다른 문자로 간주되며 두 개의 서로 다른 유니코드 숫자 식별자("코드 포인트")를 갖지만 동일하게 렌더링될 수 있다. 반대로, 물을 뜻하는 한자("水")는 일본어 텍스트에서 중국어 텍스트에서와 약간 다른 모양을 가질 수 있으며, 지역 글꼴이 이를 반영할 수 있다. 그러나 유니코드에서는 동일한 문자로 간주되며 동일한 코드 포인트를 공유한다.
유니코드 표준은 또한 이러한 추상 문자와 컴퓨터에서 표현을 용이하게 하는 숫자 코드와 쌍을 이루는 '코드화된 문자' 또는 '인코딩된 문자'를 구별한다. 결합 문자는 유니코드에서도 다루어진다. 예를 들어, 유니코드는 각 문자에 코드 포인트를 할당한다.
이렇게 하면 단어 'naïve'의 중간 문자를 단일 문자 'ï'로 코딩하거나 문자 'i'와 결합 분음 기호의 조합으로 코딩할 수 있다: (U+0069 라틴 소문자 I + U+0308 결합 분음 기호).
4. C/C++ 프로그래밍 언어와 문자 자료형
C와 C++에서 `char`는 8비트 정수형 변수로, 아스키(ASCII) 코드 처리에 사용된다. `char`는 CPU 입장에서는 정수형이지만, 인간의 문자 처리를 위해 만들어졌다. 아스키 코드는 7비트이므로, 8비트 정수형의 부분집합으로 표현 가능하다. `char` 변수는 정수형 연산을 통해 아스키 코드 변환이 가능하며, 예를 들어 'A'를 'a'로 바꾸는 것이 가능하다. 또한, UTF-8 코드 처리도 가능하다. C/C++에서 문자열(string)은 끝에 0(null)이 추가되므로, 정해진 배열 크기 내에서 문자열 처리가 이루어져야 한다.
초기 컴퓨터는 미국에서 개발되어 8비트 코드만으로 문자를 표현했지만, 국제화되면서 16비트 UNICODE 체계가 도입되었다. `char` 변수로는 유니코드 처리가 불가능하며, `char` 배열에 유니코드를 저장하면 알파벳 한 글자가 0+ASCII 코드 형태로 저장되어 한 글자만 인식되는 문제가 발생한다.
이러한 문제를 해결하기 위해 `wchar_t`가 도입되었다. `wchar_t`는 와이드 문자를 저장하기 위한 자료형으로, 플랫폼에 따라 16비트 또는 32비트로 정의된다. 최근 C 표준에서는 `char`가 UTF-8 코드 단위를 저장하도록 요구하며, 최소 8비트 크기를 요구한다. 유니코드 코드 포인트는 최대 21비트가 필요할 수 있는데, 이는 `char`에 맞지 않으므로 UTF-8과 같은 가변 길이 인코딩이 사용된다.
최신 POSIX 문서는 "character"를 단일 그래픽 기호 또는 제어 코드를 나타내는 하나 이상의 바이트 시퀀스로 정의하고, `char` 데이터를 참조할 때는 "byte"를 사용하려고 시도한다.
유니코드 처리를 위해 `char16_t`, `char32_t` 자료형도 추가되었다. `char16_t`는 UTF-16을, `char32_t`는 UTF-32를 저장하는데 사용된다.
C99 및 C++11에서는 폭을 규정한 정수형으로 `int8_t`/`uint8_t` 및 `std::int8_t`/`std::uint8_t`가 추가되었다. C++20에서는 UTF-8로 인코딩된 문자를 저장하는 것을 상정한 부호 없는 문자형으로 `char8_t`가 규정되었지만, 8비트 폭이라는 보장은 없다[1]。
5. 한글과 문자 처리
일본에서는 일상생활과 업무에 한자가 필수적이기 때문에 256개보다 많은 문자를 처리하려는 요구가 강했다. 그래서 나타난 것이 하나의 문자를 여러 바이트로 나타내는 멀티바이트 문자(MBC)이다. 특히 초창기에는 2바이트를 사용하는 것이 대부분이었으며, 더블바이트 문자(DBC)라고 불렀다.
또한 미국 이외의 국가나 지역에서 각각 필요한 문자를 추가한 문자 집합과 문자 코드를 만들었기 때문에 다수의 문자 집합과 문자 코드가 난립하는 결과를 낳았다. 유니코드는 그 문제를 해소하고 문자 집합을 통일하기 위해 탄생했다.
6. 역사
초기 컴퓨터에서는 입출력 매체로 천공 카드나 텔레타이프 전신망(텔렉스)용 종이 테이프가 사용되었다. 따라서, 1컬럼 또는 1열의 5~7비트 코드가 1문자를 나타냈다.
System/360 이전의 컴퓨터는 사용 분야에 따라 설계가 달랐는데, 주로 과학 기술 계산용과 사무 처리용으로 나뉘었다. 과학 기술 계산용은 40비트 전후의 워드 길이와 워드 어드레싱을 사용하며 워드 단위 연산에 능한 워드 머신이었다. 반면, 사무 처리용은 문자 단위 어드레싱이나 4자 또는 6자를 1워드로 하는 워드 어드레싱을 사용하며 문자 단위 처리에 능한 문자 머신이었다.
System/360의 출시로 바이트 머신이 표준이 되었다.
6. 1. 캐릭터 디스플레이
래스터 스캔 방식의 디스플레이는 표시할 때 픽셀마다 밝기를 결정해야 한다. RAM이 비쌌던 시절, 컴퓨터는 주로 명령줄 인터페이스를 사용했고, 문자 정보만 표시하는데 디스플레이 전체 픽셀에 대응하는 RAM (VRAM)을 사용하는 것은 비용이 많이 들었다. 그래서 8×8과 같이 일정한 크기의 도트 매트릭스마다 1바이트의 기억 영역을 할당하여 VRAM 용량을 절약하는 '''캐릭터 디스플레이'''가 일반적이었다. 또한, 여기에 맞는 디스플레이 컨트롤러가 사용되었다. 현재 PC/AT 호환기종 칩셋에도 이러한 표시 기능이 남아있으며, BIOS 화면 등에서 사용된다.일본산 퍼스널 컴퓨터 초기에도 많은 기종이 비슷한 구조를 가졌고, 텍스트 VRAM 값을 기준으로 캐릭터 디스플레이가 이루어졌다. 대부분 8×8 픽셀 패턴이 미리 정의된 캐릭터 제너레이터 ROM을 본체에 가지고 있었고, 대문자, 소문자 알파벳, 숫자, 가타카나, 기호가 정의되었다. 기호 중에는 4×4 픽셀 패턴을 정의하여 배치함으로써 도형 등을 표시하는 "세미 그래픽스"도 있었다. 기호 부분은 기종에 따라 다양했으며, 요일, 게임 캐릭터, 트럼프 수트 등이 있었고, 히라가나 패턴을 가진 기종도 있었다.
캐릭터 디스플레이의 제한을 보완하기 위해 텍스트 VRAM에 별도 어트리뷰트 영역이 마련되어, 표시 색상, 배경색, 브링크 등을 여러 문자마다 또는 문자마다 지정할 수 있었다.
각 캐릭터군을 조합하여 그림을 그리는 것을 아스키 아트라고 부르기도 하고, 어트리뷰트 등을 활용한 텍스트 화면으로 그려진 그림을 캐릭터 그래픽이라고 불렀다. MZ-700은 그래픽용 VRAM은 없지만, 텍스트, 배경 색상을 문자 단위로 지정할 수 있어, 체커를 이용한 디더링 등으로 그림을 그리는 시도도 있었다. 이러한 방법은 해상도는 낮지만, 성능이 낮은 CPU에서도 역동적인 그리기를 실현할 수 있다는 장점이 있었다.
그래픽스 플레인을 가질 수 있게 된 시기에는, 문자 그리기를 서브 프로세서와 주변 회로에 맡기고 그래픽스 플레인에 직접 그리는 구현도 있었다. 이 경우에도 텍스트 VRAM에 해당하는 영역은 존재하며, "문자 코드만"으로 텍스트를 다루는 방법은 존재한다.
이러한 구현은 영어권이나 영숫자만 다루는 경우에는 유용했지만, 일본어를 다루는 데는 큰 제한이 있었다. 많은 기종에서 그래픽스 플레인에 한자 ROM을 병용하여 소프트웨어로 ROM 내 패턴을 그렸지만, 하드웨어적으로 확장된 텍스트 플레인을 추가하고 캐릭터 디스플레이 형태로 한자 표시를 실현하는 기종도 있었다.
8비트 기기에서는 X1turbo, MZ-2500, 16비트 기기에서는 PC-9801 시리즈가 이러한 구조를 가졌으며, 문자로 한자를 다룸으로써 그래픽스 플레인에 그리는 것보다 고속으로 처리할 수 있었다. 이는 PC-9801 시리즈가 일본에서 보급된 한 요인이기도 하다.
다만, 이 구현에서는 화면에 전개하는 폰트를 본체에 가지고 있어야 했고, ROM, RAM 등 메모리가 비쌌던 시대에는 옵션이거나 JIS 제1수준만 구현된 경우도 있어, 본체에 포함되지 않은 폰트는 정상적으로 표시되지 않았다.
6. 2. 프로그래머블 문자 생성기 (PCG)
프로그래머블 문자 생성기(Programmable Character Generator, PCG)는 문자 패턴을 롬이 아닌 램에 저장하여 재작성할 수 있게 한 기능이다. 초기 아케이드 기판이나 패밀리 컴퓨터 등에서 타일링 배경과 기능이나 구현 방식이 유사했지만, 이 경우에는 소프트웨어 카트리지 등과 함께 롬에 기록된 것을 사용하는 경우가 많았다.PCG는 문자 단위로 관리되므로, 정의된 데이터를 변경하면 텍스트 VRAM에 정의된 표시되는 문자에 반영된다. 따라서 흩어져 있는 것들을 동시에 재작성하는 것도 가능하다. 이를 이용하여 표시 패턴을 재정의함으로써 의사적인 스무스 스크롤, 다중 스크롤, 파도, 별, 물, 강물의 흐름을 표현하거나 화면 와이프 처리에 이용할 수 있다.
MSX나 MZ-1500 등에서는 텍스트 화면을 확장하는 형태로 그래픽 표시에도 사용되었다. 전자는 화면을 3분할하여 화면 상/중/하에 해당하는 부분별로 256종류의 패턴과 1라인당 2색을, 후자는 1024개의 정의 패턴을 임의로 배치함으로써 픽셀마다 8색 중 임의의 색으로 비트맵 표시를 실현했다. X1은 픽셀마다 8색 중 임의의 색으로 정의할 수 있는 패턴을 256종 가지고 있으며, 위의 기종들과 달리 그래픽 플레인과 겹쳐서 표시할 수 있었다.
폰트 롬을 사용한 하드웨어 문자 표시를 하는 표시계에서 외자 기능 때문에 일부 영역이 재작성 가능한 램으로 되어 있는 경우가 있었는데, 이 또한 일종의 PCG라고 할 수 있다.
참조
[1]
웹사이트
UTF-8エンコーディングされた文字の型として`char8_t`を追加 - cpprefjp C++日本語リファレンス
https://cpprefjp.git[...]
[2]
웹사이트
Character (Java Platform SE 8 )
https://docs.oracle.[...]
[3]
웹사이트
.NET でのchar文字エンコードの概要 | Microsoft Docs
https://docs.microso[...]
[4]
웹사이트
http://www.regular-e[...]
[5]
문서
See also the [:word:]
regular expression character class
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com