컴퓨터활용/유닉스

전각 문자를 반각 문자로 변환하는 C 프로그램

멜번초이 2008. 7. 14. 17:11
반응형

반각(半角)문자와 전각(全角)문자, 라는 것은 원래 "인쇄용어"입니다.

전각문자는 "정사각형" 안에 들어가는 문자이고, 반각은 그 정사각형의 반쪽에 들어가는 문자입니다. 전각문자의 폭은, 반각문자의 2배입니다. 예를 들어 숫자 "3" 은, 한글 "가"의 절반의 폭만을 가지고 있습니다. 그래서 영문과 숫자 등은 반각이고, 한글이나 한자들은 전각문자입니다. 다만, 영문과 숫자를 전각으로 표현할 수도 있습니다.
컴퓨터에서, 반각문자는 1바이트, 전각문자는 2바이트로 표현됩니다. 숫자 "3"을 표현할 때는 1바이트로 충분하지만, 한글 낱자 "가"를 표현할 때는 2바이트가 필요합니다.

영문 알파벳은 반각이다. 컴퓨터를 처음 만든 놈들 입장에서 보면 알파벳이 정상이고 한글 같은 것들이 비정상으로 보이겠지만 우리는 2byte 로 표현하는 우리글자를 전각, 알파벳같이 1byte로 표현이 가능한 문자를 반각이라고 부른다. 알파벳과 한글을 같이 섞어서 표시해 놓으면 한글은 2byte 고 알파벳은 1byte라서 오른쪽 끝 줄 맞추기가 곤란하다. 들쑥날쑥 하게된다는 말이다. 그래서 알파벳도 그냥 전각으로 만들어 사용하는 프로그램들이 있다. 특히 금융권 메인 호스트 프로그램들에서 흔히 사용된다.

원래  "A동501호" 라고 표현할 것을 아예 숫자와 알파벳을 모두 전각으로 사용하여 "A동501호" 라고 사용하는 것이다. 모든 문자가 2byte이므로 오른쪽 끝줄을 가지런하게 맞출 수 있는 장점이 있겠다.

전각 문자를 찍어 보는 프로그램을 짜서 돌려 보면 이해가 팍 된다.

#include <stdio.h>
#include <string.h>

main() {
    char full[3];

    char aa = 0xa3;
    char ab = 0xa1;
    char b;
    int cr = 1;

    for ( int x=0; x<94; x++, cr++ ) {
        b = ab + x;

        zero[0] = aa;
        zero[1] = b;
        zero[2] = 0x00;

        printf("[%x][%x] = [%s]       ", full[0], full[1], full );
        if ( cr == 4 ) {  printf("\n"); cr=0; }   /* 줄바꾸기 */
    }
};

이 프로그램의 출력 결과는 다음과 같다.

[a3][a1] = [!]       [a3][a2] = ["]       [a3][a3] = [#]       [a3][a4] = [$]
[a3][a5] = [%]       [a3][a6] = [&]       [a3][a7] = [']       [a3][a8] = [(]
[a3][a9] = [)]       [a3][aa] = [*]       [a3][ab] = [+]       [a3][ac] = [,]
[a3][ad] = [-]       [a3][ae] = [.]       [a3][af] = [/]       [a3][b0] = [0]
[a3][b1] = [1]       [a3][b2] = [2]       [a3][b3] = [3]       [a3][b4] = [4]
[a3][b5] = [5]       [a3][b6] = [6]       [a3][b7] = [7]       [a3][b8] = [8]
[a3][b9] = [9]       [a3][ba] = [:]       [a3][bb] = [;]       [a3][bc] = [<]
[a3][bd] = [=]       [a3][be] = [>]       [a3][bf] = [?]       [a3][c0] = [@]
[a3][c1] = [A]       [a3][c2] = [B]       [a3][c3] = [C]       [a3][c4] = [D]
[a3][c5] = [E]       [a3][c6] = [F]       [a3][c7] = [G]       [a3][c8] = [H]
[a3][c9] = [I]       [a3][ca] = [J]       [a3][cb] = [K]       [a3][cc] = [L]
[a3][cd] = [M]       [a3][ce] = [N]       [a3][cf] = [O]       [a3][d0] = [P]
[a3][d1] = [Q]       [a3][d2] = [R]       [a3][d3] = [S]       [a3][d4] = [T]
[a3][d5] = [U]       [a3][d6] = [V]       [a3][d7] = [W]       [a3][d8] = [X]
[a3][d9] = [Y]       [a3][da] = [Z]       [a3][db] = [[]       [a3][dc] = [₩]
[a3][dd] = []]       [a3][de] = [^]       [a3][df] = [_]       [a3][e0] = [`]
[a3][e1] = [a]       [a3][e2] = [b]       [a3][e3] = [c]       [a3][e4] = [d]
[a3][e5] = [e]       [a3][e6] = [f]       [a3][e7] = [g]       [a3][e8] = [h]
[a3][e9] = [i]       [a3][ea] = [j]       [a3][eb] = [k]       [a3][ec] = [l]
[a3][ed] = [m]       [a3][ee] = [n]       [a3][ef] = [o]       [a3][f0] = [p]
[a3][f1] = [q]       [a3][f2] = [r]       [a3][f3] = [s]       [a3][f4] = [t]
[a3][f5] = [u]       [a3][f6] = [v]       [a3][f7] = [w]       [a3][f8] = [x]
[a3][f9] = [y]       [a3][fa] = [z]       [a3][fb] = [{]       [a3][fc] = [|]
[a3][fd] = [}]       [a3][fe] = [ ̄]

안타깝게도 웹에디터에서는 전각문자를 붙여 넣어도 반각으로 밖에 표현을 안 해주기 때문에 결과가 전각문자인지 언뜻 구분이 되지 않는다. 따라서 전각, 반각 문자를 동시에 출력해 주는 프로그램을 작성하여 이미지 덤프를 떠서 아래에 게시하였다.

사용자 삽입 이미지
이러한 결과를 출력한 프로그램은 다음과 같다.

#include <stdio.h>
#include <string.h>

main() {

    char full[3];

    char aa = 0xa3;
    char ab = 0xa1;
    char xb;
    int cr=1;
   
    char half[2];
      
    for (  int x=0; x<94; x++, cr++ ) {
        xb = ab + x;
        full[0] = aa;
        full[1] = xb;
        full[2] = 0x00;
       
        half[0] = xb-0x80;  /* 0x80 은 십진수로 120 에 해당 된다 */
        half[1] = 0x00;
       
        printf("[%x][%x]:[%x] = [%s:%s]  ", full[0], full[1],  half[0], full, half );
        if ( cr == 4 ) {  printf("\n"); cr=0; }
    }
     
}


전각문자와 반각문자는 아스키 코드값이 120 차이가 난다. 즉 16진수로는 80 만큼 차이가 나는 것이다. 전각문자는 2byte 로 표현되는데 첫바이트는 무조건 0xa3 으로 고정임을 감안하고 두번째 byte 에는 해당 문자의 값을 세트해 주면 된다.  이점을 이해하고 위의 프로그램을 이해했다면 전각문자를 반각문자로 바꾸어 주는 프로그램을 쉽게 구현할 수 있다.







반응형