wchar_t라는 녀석을 쓰면 소위 wide character라는 걸 다룰 수가 있어요.
문제는 그걸 출력할 때인데, C11 표준을 읽어보면 printf가 lc 포맷 지정자를 받으면 wide char를 받아 multibyte char로 변환한답니다. 그 과정에서 로케일(locale)이라는 게 개입되는데 솔직히 저는 여전히 로케일이 뭔지 잘 몰라요. 그냥 적절한 순간에 적절히 마법 주문처럼 setlocale(LC_ALL,"");라고 한 번 외쳐 주면 잘 될 수 있다더라... 정도만 알고 지냅니다.
마음 잡고 공부해도 이해가 안 될 정도로 어려운 개념일 거라고 생각하지는 않는데, 안 그래도 배울 거 많은 세상에 솔직히 귀찮네요. 언제고 제가 진지한 프로그래밍을 하다가 저 마법 주문이 안 먹히는 순간이 오면 그 때 공부하려고요.
윗분이 설명을 잘못하긴거같은데
windows에서 console은 보통 multibyte로 합니다만
글쓴이분은 linux환경이신거같네요 linux에서는 utf-8환경에서 하는 경우가 대부분이라 알고있습니다.
별모양은 2byte짜리이기 때문에 1바이트씩 분할해서 출력하면 정상출력 됩니다.
multibyte character와 wide character는 C언어 표준에서 사용하는 용어입니다.
C11 std wrote:
3. Terms, definitions, and symbols
3.7.2
1 multibyte character
sequence of one or more bytes representing a member of the extended character set of
either the source or the execution environment
2 NOTE The extended character set is a superset of the basic character set.
3.7.3
1 wide character
value representable by an object of type wchar_t, capable of representing any character
in the current locale
따라서 Linux도 예외가 아니며, utf-8로 2바이트 인코딩된 ★, ☆는 multibyte character에 속합니다.
참고해보세요.
문자열 끝을 0x00 으로 채워줘야 하지만. 그냥 되네요.
확인해보셔야 할겁니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
★ 검색해보면 U+2605, 즉 유니코드에서
★ 검색해보면 U+2605, 즉 유니코드에서 16진수로 2605번째(?), 10진수로 9733번째(?) 문자로 뜹니다.
근데 signed char로 표현할 수 있는 범위는 -128부터 127까지죠.
C언어에서 ★, ☆와 같은 문자들은 대개 멀티바이트
C언어에서 ★, ☆와 같은 문자들은 대개 멀티바이트 문자(Multibyte character)에 속합니다.
말인즉슨 분명히 문자 하나이지만
char
하나, 그러니까 1바이트에 담기지 않는다는 얘기지요.질문자님의 프로그램은 일단 이런 식으로 고쳐볼 수 있습니다.
분명히 문자 하나를 다루는데 문자열을 다루듯 해야 하는 불편함을 저한테 따지셔봤자 소용 없습니다. :(
물론 극복할 방법이 있긴 한데... 산 넘어 산입니다.
wchar_t
라는 녀석을 쓰면 소위 wide character라는 걸 다룰 수가 있어요.문제는 그걸 출력할 때인데, C11 표준을 읽어보면
printf
가 lc 포맷 지정자를 받으면 wide char를 받아 multibyte char로 변환한답니다. 그 과정에서 로케일(locale)이라는 게 개입되는데 솔직히 저는 여전히 로케일이 뭔지 잘 몰라요. 그냥 적절한 순간에 적절히 마법 주문처럼setlocale(LC_ALL, "");
라고 한 번 외쳐 주면 잘 될 수 있다더라... 정도만 알고 지냅니다.마음 잡고 공부해도 이해가 안 될 정도로 어려운 개념일 거라고 생각하지는 않는데, 안 그래도 배울 거 많은 세상에 솔직히 귀찮네요. 언제고 제가 진지한 프로그래밍을 하다가 저 마법 주문이 안 먹히는 순간이 오면 그 때 공부하려고요.
아무튼 답변은 이 정도면 충분하겠군요.
윗분이 설명을 잘못하긴거같은데
윗분이 설명을 잘못하긴거같은데
windows에서 console은 보통 multibyte로 합니다만
글쓴이분은 linux환경이신거같네요 linux에서는 utf-8환경에서 하는 경우가 대부분이라 알고있습니다.
별모양은 2byte짜리이기 때문에 1바이트씩 분할해서 출력하면 정상출력 됩니다.
multibyte character와 wide
multibyte character와 wide character는 C언어 표준에서 사용하는 용어입니다.
따라서 Linux도 예외가 아니며, utf-8로 2바이트 인코딩된 ★, ☆는 multibyte character에 속합니다.
사알짝 비틀어봤어요~
사알짝 비틀어봤어요~
[우분투 18.04 파여폭스 나비에서 적었어요~]
댓글 달기