Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

C99의 UCN(Universal Character Name)에 대 해서...

101 views
Skip to first unread message

Lee, Sin-jae.

unread,
Jul 24, 2003, 4:04:41 PM7/24/03
to
전웅님의 C언어 펀더멘탈 116쪽에 보면, C99에는 UCN이라는 것이 도입되어 식
별자에 영어 외의 문자도 사용할 수 있다고 쓰여 있습니다. 맨날 코드 짜는
시간보다 변수와 함수의 이름 정하는 시간이 더 걸리는 저로서는 참으로 기대
되는 부분이 아닐 수 없습니다. ^^;

그런데, C99에서 UCN에 대해 찾아보면 다음과 같이 나와 있습니다.

6.4.3 Universal Character names

universal-character-name:
\u hex-quad
\U hex-quad hex-quad
hex-quad:
hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit

제가 바라던 것은 아래와 같이 사용하는 것인데,

int 전체합;

위와 같은 식이라면 아래와 같이 사용해야 된다는 뜻이 아닌가요?

int \u1234\u5678\uABCD\u4321\u8765\uFEDC;
('전체합'의 UCS 코드를 찾기가 귀찮아서 임의의 16진수를 사용했습니다;;;)

이렇게 되면 애초에 바라던 int 전체합; 과 같은 식으로는 사용하지 못한다는
얘기가 되는데, 이게 어찌된 일인지 자세히 알고 싶습니다. 애초에 의도는 식
별자에 basic character set이 아닌 문자들을 사용할 수 있도록 허가하려는
것 같은데...

혹시 \u hex-quad 라 함은 \uFEDC같은 것을 뜻하는 것이 아니라 hex-quad 값
을 갖는 멀티바이트 문자 자체를 뜻하는 것인가요?

--
Lee, Sin-jae.
E-mail: lsj0713 at yahoo dot co dot kr

Ji Hun, SEO

unread,
Jul 25, 2003, 3:03:47 AM7/25/03
to
뭐 제가 이것에대해 자세히 본건 아니지만...
이건 단순히 unicode 값을 사용을 할 수가 있다는 것이지...
java처럼 unicode variable 을 사용을 허가 한다는 얘기는 아닌듯 하네요...
원래 영문권이야... ascii 값으로 모두 나타낼 수가 있으나...
한글, 한자등은 그렇지가 못하죠...
아님 어떤 특수 문자라던지를 나타낼 때 사용을 하지 않을까 생각을
하는데요...-_-ㅋ
혹시 여기에 대해 자세히 아시는 분 있나요?

<어떠한 역경에도 굴하지 않는 '하양 지훈'>


"Lee, Sin-jae." <a@a.a> wrote in message
news:bfpejo$aba$1...@news.kreonet.re.kr...

Jun Woong

unread,
Jul 27, 2003, 12:27:20 AM7/27/03
to

"Lee, Sin-jae." <a@a.a> wrote in message news:bfpejo$aba$1...@news.kreonet.re.kr...
> 전웅님의 C언어 펀더멘탈 116쪽에 보면, C99에는 UCN이라는 것이 도입되어 식
> 별자에 영어 외의 문자도 사용할 수 있다고 쓰여 있습니다. 맨날 코드 짜는
> 시간보다 변수와 함수의 이름 정하는 시간이 더 걸리는 저로서는 참으로 기대
> 되는 부분이 아닐 수 없습니다. ^^;
>
> 그런데, C99에서 UCN에 대해 찾아보면 다음과 같이 나와 있습니다.
>
> 6.4.3 Universal Character names
>
> universal-character-name:
> \u hex-quad
> \U hex-quad hex-quad
> hex-quad:
> hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit
>
> 제가 바라던 것은 아래와 같이 사용하는 것인데,
>
> int 전체합;
>
> 위와 같은 식이라면 아래와 같이 사용해야 된다는 뜻이 아닌가요?
>
> int \u1234\u5678\uABCD\u4321\u8765\uFEDC;
> ('전체합'의 UCS 코드를 찾기가 귀찮아서 임의의 16진수를 사용했습니다;;;)
>
> 이렇게 되면 애초에 바라던 int 전체합; 과 같은 식으로는 사용하지 못한다는
> 얘기가 되는데, 이게 어찌된 일인지 자세히 알고 싶습니다. 애초에 의도는 식
> 별자에 basic character set이 아닌 문자들을 사용할 수 있도록 허가하려는
> 것 같은데...

이는 C90 에서도 이미 가능했던 것이었습니다. C90 에서는 명칭에 표준이
정의해 놓은 문자 외의 문자를 사용하는 경우, 간단히 undefined behavior
가 되고 이 undefined behavior 를 이용해 implementation 은 추가적인 문
자를 지원하는 확장을 제공할 수 있었습니다 - 이 확장은 표준을 엄격히 따
르는 프로그램 (strictly conforming program) 에 아무런 문제를 일으키지
않는 conforming extension 입니다.

C90 Common extensions 중 G.5.2 Specialized identifiers:

Characters other than the underscore _, letters, and digits, that
are not defined in the required source character set (such as the
dollar sign $, or characters in national character sets) may
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
appear in an identifier (6.1.2).

C99 에서는 이를 보다 적극적으로 지원해 (여전히 이식성이 중요한 프로그
램에서는 불가능하지만) 명칭에서 사용할 수 있는 추가적인 문자를
implementation 이 document 하도록 요구하고 있습니다.

C99 6.4.2 Identifiers (Syntax)

identifier:
identifier-nondigit
identifier identifier-nondigit
identifier digit

identifier-nondigit:
nondigit
universal-character-name
other implementation-defined characters
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

UCN 은 명칭에 "전체합" 같은 추가적인 비표준 문자를 사용하는 프로그램이
이식성을 확보할 수 있는 방법을 제공하는 것 뿐입니다. 말씀하신대로 이식
성을 고민하는 프로그램은 여전히 명칭에 "전체합" 같은 비표준 문자를 사
용할 수 없습니다. 또한, 이식성을 고민하며 UCN 을 사용할 경우 보여주신
것처럼 \u, \U 표기를 사용해 문자를 구성해야 합니다 - 이 경우 모든 가능
한 UCN 이 허락되는 것이 아니라 normative annex D (UCNs for
identifiers) 에 나열되어 있는 UCN 만이 명칭의 문자로 사용 가능함에 유
의하셔야 합니다. 하지만, 과거 UCN 이 아예 존재하지 않던 시절에는
"전체합" 같은 비표준 multibyte 문자를 명칭에 사용한 프로그램이 그 의미
를 유지하며 이식성을 얻는 방법이 전혀 없었지만, 지금은 명칭에 허락된
추가적인 multibyte 문자를 UCN 을 매개로 변환함으로써 (물론, 수작업으로
변환하는 작업을 염두에 둔 것은 절대 아닙니다 ^^;) ISO 10646 을 지원하
지 않고 서로 다른 extended character set 을 지원하는 implementation 사
이에서도 여전히 이식성 있는 프로그램으로 남을 수 있는 방법이 생긴 것입
니다 - 물론, UCN 이 ISO 10646 에 대한 지원과 함께 도입된 것이기에 ISO
10646 을 지원하는 implementation 에서는 해당 UCN 을 의도한 표현
(glyph) 으로 볼 수 있을 것입니다. 참고로, UCN 의 도입이 ISO 10646 을
지원하지 않는 implementation 을 배제하는 결과는 낳는 것은 아닙니다:

Footnote 59:

On systems in which linkers cannot accept extended characters, an
encoding of the universal character name may be used in forming
valid external identifiers. For example, some otherwise unused
character or sequence of characters may be used to encode the \u
in a universal character name. Extended characters may produce a
long external identifier.

C99 가 아직도 널리 구현되고 있지 않은 현실에서 아직까지는 UCN 의 도입
이 눈에 띄는 변화를 보이지는 못하지만, C99 와 ISO 10646 (혹은 Unicode)
이 널리 대중화된다면 부분적으로나마 원하시는 효과를 볼 수 있으리라 예
상합니다.

그럼...


--
Jun, Woong (myco...@hanmail.net)
Dept. of Physics, Univ. of Seoul
Web : http://c-expert.uos.ac.kr

0 new messages