다음 이전 차례

12. ASCII가 아닌 문자세트에서 프로그램 사용하는 법

불행했던 과거에는 이것이 상당히 문제거리였다. 각각의 프로그램들이 개별적으로 모든 비트가 제대로 남아 있는지 확인해야 했다. 물론 현재도 모든 것이 쉬운 것은 아니다. 하지만 최근에 많은 gnu 유틸리티에서 LC_CTYPE=iso_8859_1 또는 LC_CTYPE=iso-8859-1에 대해서 어떻게 대응해야 하는지 알고 있다. 이 방법을 먼저 시도해 보고 안되면 아래에 소개한 힌트를 참고해 보라. libc의 최신 버전에서 setlocale()은 locale 화일(즉, /usr/lib/locale)을 설치해야만 제대로 작동한다는 점에 유의해야 한다.

우선, 8번째 비트가 커널 입력 프로세스에서 살아 남도록 stty cs8 -istrip -parenb가 설정되었는지 확인한다.

A. emacs의 경우에는 개별적인 사항은 그 버전에 상당히 의존한다. 아래 정보는 버전 19.34에 대한 것이다. 사용자의 $HOME/.emacs에 아래와 같은 내용을 넣는다.

        (set-input-mode nil nil 1)
        (standard-display-european t)
        (require 'iso-syntax)
첫번째 줄 (정확히는 마지막의 1)은 emacs가 입력되는 문자들의 8번째 비트를 없애지 않도록 지정한다. 두번째 줄은 emacs가 비ASCII 문자를 8진수 이스케이프로 표시하지 않도록 한다. 세번째 줄은 syntactic 특성을 지정하고 Latin-1 문자세트를 변환 테이블로 적용하도록 한다. 사용자가 환경변수로 LC_CTYPE=ISO-8859-1를 설정했다면 뒤의 두 줄은 중복되는 것이다. (여기에 사용되는 변수는 LC_ALL 또는 LANG일 수도 있다. 값은 뒤에 붙는 숫자가 `88591' 또는 `8859-1' `8859_1' 등 어느것도 된다.)

여기까지 되어 있으면 일단 OK. 비ASCII ISO 8859-1 심볼을 표시하지 못하는 터미널에서는

        (load-library "iso-ascii")
라고 명령을 내리면 액샌트 기호의 문자가 표시될 것이다. 사용자의 keymap이 비ASCII 문자를 만들기 쉽지 않다면
        (load-library "iso-transl")
라고 명령을 내리면 2문자 시퀀스 Ctrl-X 8을 하나의 조합문자로 만든다. 따라서 4문자 시퀀스 Ctrl-X 8 , c는 c-cedilla를 만든다. 무지 불편한 방법이다.

        (iso-accents-mode)
명령은 ISO-8859-1 액센트 모드를 토글할 것이다. 이 모드에서는 ', `, ", ^, ~, / 이렇게 6개의 키가 그 다음 나오는 심볼을 변경하는 데드키이다. 특수한 조합: ~c는 cedilla가 붙은 c, ~d는 Icelandic eth, ~t는 Icelandic thorn, "s는 German sharp s, /a는 ring 붙은 a, /e는 a-e ligature, ~<와 ~>는 guillemots, ~!는 뒤집힌 감탄부호, ~?는 뒤집힌 물음표, ''는 뾰죽한 액센트이다. 액센트의 기본 대응은 위와 같다. 변수 iso-languages는 (언어 이름, 액센트 대응) 쌍의 목록이다. 디폴트와 다른 대응을 하려면
        (iso-accents-customize LANGUAGE)
를 사용하면 된다. 여기서 LANGUAGE는 "portuguese", "irish", "french", "latin-2", "latin-1" 중 하나이다.

리눅스의 디폴트 조합 문자는 Ctrl-이기 때문에 어디서나 이것을 사용하는 것이 편리할 것이다. 다음과 같이 한번 해보자.

        (load-library "iso-insert.el")
        (define-key global-map [?\C-.] 8859-1-map)
emacs -nw를 사용하는 사람이라면 두번째 줄이 말을 듣지 않을 것이다. 이 경우, .Xresources에 다음과 같은 라인을 넣어두면 된다.
        XTerm*VT100.Translations:       #override\n\
              Ctrl <KeyPress> . : string("\0308")

B. less에서는 환경변수에 LESSCHARSET=latin1을 넣어두면 된다. man 출력에 \255 또는 <AD>가 보이는 경우에도 효과가 있을 것이다. less의 어떤 버전에서는 Latin-1 출력에 허가가 거부되는 경우에 소프트 하이픈(octal 0255, hex 0xAD)을 이런 식으로 만든다.

C. ls에서는 옵션 -N을 주면 된다. (아마도 alias를 만들어 두어도 좋을 것이다.)

D. bash (버전 1.13.*)에서는 (Danish HOWTO에 따르면) 아래의 내용을 $HOME/.inputrc에 넣어두면 된다고 한다.

        set meta-flag on
        set convert-meta off
        set output-meta on

E. tcsh에서는

        setenv LANG     US_en
        setenv LC_CTYPE iso_8859_1
를 사용하면 된다. 시스템에 nls가 설치되어 있으면 그에 해당되는 루틴이 사용된다. 그렇지 않은 경우에는 tcsh는 LANG과 LC_CTYPE에 주어진 값에 관계없이 iso_8859_1을 가정한다. tcsh(1)의 NATIVE LANGUAGE SYSTEM 단락을 참조하면 도움이 될 것이다. (Danish HOWTO에는 setenv LC_CTYPE ISO-8859-1; stty pass8라고 나와 있다.)

F. flex에서 생성하는 파서가 8비트 입력을 처리할 수 있게 하려면 -8 옵션을 주면 된다. (너무 당연하다.)

G. elm에서는 displaycharsetISO-8859-1로 설정하면 된다. (Danish HOWTO: LANG=CLC_CTYPE=ISO-8859-1)

H. (lynx와 같이) curses를 사용하는 프로그램의 경우에는 David Silbey가 다음과 같은 이야기를 했다. 보통의 curses 패키지는 최상위 비트를 비디오 모드 반전용으로 사용한다. (/usr/include/curses.h에 정의되어 있는 _STANDOUT 플래그를 볼 것.) 하지만 ncurses는 8-비트를 사용하지 않는 것 같으며 iso-latin-8859-1을 올바로 보여준다.

I. (man과 같이) groff를 사용하는 프로그램의 경우, -Tascii 대신에 -Tlatin1을 사용하면 된다. man 프로그램의 구 버전에서는 col도 사용했기 때문에 다음번 항목도 같이 적용해야 한다.

J. col의 경우, 1) setlocale(LC_CTYPE,"");를 할 수 있도록 수정했는지 확인하고, 2) LC_CTYPE=ISO-8859-1를 환경변수로 넣어두어라.

K. rlogin의 경우, -8 옵션을 사용하면 된다.

L. joe의 경우, L. For joe, sunsite.unc.edu:/pub/Linux/apps/editors/joe-1.0.8-linux.tar.gz는 환경설정 화일을 편집하면 된다. 어떤 사람들은 /usr/lib/joerc 첫번째 칼럼에 -asis 옵션을 넣으라고 한다.

M. LaTeX의 경우, \documentstyle[isolatin]{article}. LaTeX2e: \documentclass{article}\usepackage{isolatin}, 여기서 isolatin.styftp://ftp.vlsivie.tuwien.ac.at/pub/8bit에서 구할 수 있다.

ISO-8859-1 주제에 대한 여러가지 좋은 논의와 8비트 문자를 다루는 방법이 grasp.insa-lyon.fr:/pub/faq/fr/accents에 (프랑스어로) 실려 있다. (영어로 된) 다른 좋은 내용은 ftp.vlsivie.tuwien.ac.at:/pub/8bit/FAQ-ISO-8859-1에서 볼 수 있으며, 미러 사이트는 rtfm.mit.edu:pub/usenet-by-group/comp.answers/character-sets/iso-8859-1-faq 이다.

8비트 문자를 제대로 다루지 못하는 프로그램을 손수 고쳐보고 싶다면 한가지 유념할 점이 있다. 만약 signed char 형 변수를 사용한다면 문자는 음수가 되는 경우가 생겨서 이것을 배열 인덱스로 취급하는 방법은 듣지 않는다. 몇몇 프로그램의 경우 경우를 잘 가려서 (unsigned char) 캐스트로 고칠 수 있다.


다음 이전 차례