[완료] wprintf( L"한글\n" ); 출력 깨짐

오호라의 이미지

#include<stdio.h>
 
int main( int ac, char* av[] )
{
    wprintf( L"한글\n" );
    wprintf( L"hello world\n" );
 
    reutrn 0;
}

한글은 깨지고, 영문은 잘 나옵니다.

?>locale
LC_ALL=ko_KR.UTF-8
LANG=ko_KR.UTF-8

?>vim .vimrc
set encoding=UTF-8

putty 설정 - UTF-8

--------------------------------

1. gcc -finput-charset=UTF-8 test.c
2. iconv -f utf-8 -t cp949 test.c -o Uni_test.c

별의 별짓 다해봐도 깨지네요. 설정 한개만 하면 될거 같은데 잘 모르겠네요.

OTL..

많은 고수님들의 조언을 부탁드립니다.

ssik425의 이미지

utf8을 출력하기 위해 별도의 평션을 사용할 필요는 없습니다.

대부분 위와 같은 경우는 vi에서 입력이 euc-kr로 만들어졌기 때문입니다.

printf로도 출력에는 문제가 없습니다.

혹 more로 소스를 출력해보면 한글이 깨져보이면 euc-kr이 맞을 겁니다.

정상적이라면 utf-8로 입력된게 맞구요...

추가로 말씀드리면 redhat9정도의 O/S를 사용하고 계신다면

set encoding=UTF-8 옵션이외에 file-encoding이라는게 하나더 있을 겁니다.

이것까지 설정을 해야만 정상적으로 UTF-8로 입력이 가능합니다.

개발자들의 궁극적 비전은 ?

peccavi의 이미지

ssik425님께서 지적하신대로 소스코드 자체의 인코딩도 관련이 있는걸로 알고있습니다.

코드 안에서 setlocale(3)을 사용해 보셨나요?

setlocale(LC_ALL, "ko_KR.UTF-8");

p.s) 그런데 저도 이게 올바른 해결 방법인지는 모르겠습니다. ;-)

----
jai guru deva om...

----
jai guru deva om...

poplinux의 이미지

질문이 있습니다.

혹시, xwindow 의 터미널을 열어서 작업중이신가요?

만약 그렇다면 터미널 내의 셋팅을 utf-8 로 바꾸더라도 xwindow 의 인코딩 셋이 utf-8 이 아니라면 알아 볼 수 없습니다.

========================
조직 : E.L.D(Embedded Linux Developer/Designer)
블로그 : poplinux@tistory.com
카페 : cafe.naver.com/poplinux

임베디드 리눅스 관련 프리렌서 지향

오호라의 이미지

OS : Ubuntu 6.10

터미널 : putty ( UTF-8, cp949 )

위에서 말씀하셨던 방법 다 써봤는데 안되네요. ^^;

좀더 삽질을 해봐야겠습니다.

Hello World.

오호라의 이미지

결국.

linux + 터미널 프로그램 + bash + C코드

이 4박자의 싸움이었습니다.

ㅠㅠ

Hello World.

geneven의 이미지

어떻게 해결하셨나요? wprintf를 쓰면 한글의 경우 그냥 ?로 나오고 있습니다.
참고로 우분투 7.10입니다

오호라의 이미지

int wprintf(const wchar_t *format, ...);

파라미터를 보시면 format만 wchar_t 입니다. ^^;

[참고]

1. 터미널 프로그램 ( putty ) 확인

> 설정->변환->[수신한 데이터를 이 문자셋으로 가정] 체크박스-> UTF-8

2. locale 확인

> LANG = ko_KR.utf8 , LC_ALL=ko_KR.utf8 ( locale -a | grep ko )

3. source 확인

3.1 wchar_t

wchar_t buff[] = L"hello world"; ( 모든 문자열에 L 붙여줌 )

> linux : sizeof(wchar_t) == 4 byte;

wchar_t buff[] = L"hello world"; ( 모든 문자열에 L 붙여줌 )

VC++ 에서 [Ctrl + F7]->프로젝트설정-> _MBCS 옆에 _UNICODE 추가해줌. ( 이왕이면 옵션에서 디버깅시 유니코드값 체크인 )

> win32 : sizeof(wchar_t) == 2byte

3.2 header file include

#include stdio.h
#include string.h
#include wchar.h
#include locale.h

3.3 setlocale call

> setlocale( LC_ALL, "korean" ); or setlocale ( LC_ALL, "ko_KR.utf8" ) ...

3.4 출력

> fputws ( wcs, stdout );

Hello World.

geneven의 이미지

우분투 7.10의 터미널이 UTF-8을 지원하지 않는걸까요? 여전히 한글이 ?로 나옵니다.
LANG값은 en_US.UTF-8로 되어있는데 ko_KR.UTF-8로 하는것과 다른결과가 나올수 있을까요?

Quote:
int wprintf(const wchar_t *format, ...);

파라미터를 보시면 format만 wchar_t 입니다. ^^;


wprintf쓸때 format앞에 L을 붙이면 되는거죠?
오호라의 이미지

> man 3 printf
s      If no l modifier is present: The const char * argument is expected to be a pointer to an array of character type (pointer to a string).   Characters
       from  the array are written up to (but not including) a terminating null byte (’\0’); if a precision is specified, no more than the number specified
       are written.  If a precision is given, no null byte need be present; if the precision is not specified, or is greater than the size  of  the  array,
       the array must contain a terminating null byte.
 
       If  an  l  modifier  is  present: The const wchar_t * argument is expected to be a pointer to an array of wide characters.  Wide characters from the
       array are converted to multibyte characters (each by a call to the wcrtomb() function, with a conversion state starting in the initial state  before
       the  first  wide  character),  up  to and including a terminating null wide character. The resulting multibyte characters are written up to (but not
       including) the terminating null byte. If a precision is specified, no more bytes than the number specified are written,  but  no  partial  multibyte
       characters  are written. Note that the precision determines the number of bytes written, not the number of wide characters or screen positions.  The
       array must contain a terminating null wide character, unless a precision is given and it is so small that the number of  bytes  written  exceeds  it

1.
> export LANG=ko_KR.utf8; export LC_ALL=ko_KR.utf8;

2.
#include stdio.h
#include string.h
#include wchar.h
#include locale.h
 
int main ( int argc, char* argv[] )
{
    char    buff[] = "english";
    wchar_t wbuff[] = L"한글";
 
    setlocale( LC_ALL, "" );
 
    fwide( stdout, -1 );
 
    printf( "%s\n", buff );
 
    printf( "%ls\n", wbuff );
 
    printf( "%ls\n", wbuff );
 
    printf( "%s\n", buff );
 
    return 0;
}

> file source.c
source.c: UTF-8 Unicode C program text

> iconv -f UTF-8 -t UTF-8 -o source-utf8.c source.c
> iconv -f EUC-KR -t UTF-8 -o source-utf8.c source.c
> iconv -f ASCII -t UTF-8 -o source-utf8.c source.c

> vim ~/.vimrc
set encoding=utf8
set fileencoding=utf8

> 글꼴 확인, 한글 지원

Hello World.

geneven의 이미지

제가 두가지를 빼먹었었네요.

setlocale( LC_ALL, "" );
다른 하나는
wprintf시 포맷팅 단어에 %ls가 아닌 %s로 했었습니다.

궁금증이 하나 더 생깁니다. UTF-8같은경우는 가변바이트인코딩인데 리눅스에서 확인해보니 wchar크기가 4바이트나 되네요.
영어 한글자를 저장하기 위해 무려 3바이트가 낭비되는건데, 실제 UTF-8프로그래밍시에도 wchar형태를 쓰나요?

오호라의 이미지

각자 취향이겠죠.

 input -> wrapping -> processing -> wrapping -> output
 
input : UTF-8, EUC-KR, ASCII
 
processing : ?
 
output : EUC-KR

일반적으로 input이 문제죠. 입력자체가 파일이라면 BOM( byte order marks, 모든 에디터가 표준을 지키지는 않음. )으로 알수 있겠지만 fgets()와 같이 사용자 입력을 받는다면 초난감이죠. setlocale(), nl_langinfo()... 등을 이용해서 시스템 로우컬을 알아와서 처리하는 수밖에는 없죠.

처리하기전에 문자열만 순결(?)하다면 내부적으로 사용하는데 큰 어려움이 없을듯합니다.

Hello World.

바라미의 이미지

http://barami.org/archives/19
참고 되셨으면 좋겠네요 :)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.