C의 character set

지환·2024년 1월 14일
0
읽다 보면 굳이 이런 것까지 생각해야되나 싶은 글일 수 있지만,
여러 환경에서도 동일한 동작을 보장하기 위한 탐구 과정이 의미는 없지 않은 것 같아서 한번 간단하게 기록해본 글이다.
for (char i = 'a'; i <= 'z'; i++)
	printf("%c ", i);

a~z까지 출력하는 C 코드를 작성해야 했을 때 자연스럽게 위 코드를 적었다. 근데 갑자기 의문이 들었다. C 표준에선 저렇게 알파벳 소문자들이 연속적으로 인코딩되도록 보장할까?

내가 받은 문제에선 테스트 환경이 명시돼있었기 때문에 그 환경만 확인해보면 됐지만, (본인 포함) 대부분의 사람들이 별 생각 없이 ASCII만 생각하고 저렇게 코드를 작성할 것 같아서('a'의 ASCII 코드 값인 97을 그대로 사용하는 경우도 있었다), 과연 표준 같은 것에 의해 제대로 보장이 된 건지 궁금했다. ASCII를 사용하지 않는 환경에서도 같은 동작을 하리란 보장은 없지 않을까? 이런 궁금증에 대해 찾아본 것을 차례대로 한번 정리해볼까 한다.

1. 대부분 문자 인코딩 방식들이 알파벳을 연속적으로 배치할까?

아니다. 반례를 금방 찾을 수 있었다.
EBCDIC이라고 하는 또 다른 문자 인코딩 방식을 보면 아래 표와 같이 알파벳 문자들이 연속된 값을 가지지 않는 다는 것을 알 수 있었다.
즉, 만약 내가 작성한 위에 C 코드의 문자들이 EBCDIC으로 인코딩 된다면 예상하지 못한 결과가 나올 것이다.

2. 그럼 C 표준에서 ASCII를 사용하도록 명시하거나 인코딩된 알파벳은 연속된 숫자를 가지도록 명시하였을까?

C 표준에선 '0'~'9'가 연속적인 코드를 가지도록 명시할 뿐이지 문자에 대해서 존재한다는 말 외엔 언급되는 사항은 없다고 한다.[출처]

3. 그럼 내가 작성한 코드는 틀린건가?

(솔직히 대부분 ascii를 사용할 것이고, 다양한 국가의 언어를 지원하기 위해 만들어진 많이 쓰이는 unicode도 ascii의 superset이기 때문에 대부분 경우 위처럼 코드를 적어도 별 문제는 없을 것이다. 무엇보다 저 문제의 테스트 환경에서 테스트해보니 잘 작동했다!)

좀 더 환경 독립적으로 코드를 작성하려면 사실상 아래와 같이 반복문 없이 하나하나 찍어주는 게 가장 확실한 방법일 것이다.

printf("%c ", 'a');
printf("%c ", 'b');
...
printf("%c ", 'z');

0개의 댓글