C 프로그램잉 리눅스 argv를 wchar_t인 argv로 복사 하는 좋은 방법이 없을까요?

babbab의 이미지

int main( int argc, char *argv[])
부분을 wchar_t *wargv[]란 곳에 복사하여 commandline argument를 한글로 작업하고자 합니다.
어떠 어떠한 좋은 방법이 있을까요?

Anti-Lock의 이미지

윈도우(비주얼스튜디오?)환경이라면 유니코드로 설정해서
_wmain 을 사용하시면 간단할 것 같다는 생각이 듭니다만...

그냥 인자를 한개씩 wchar_t 배열로 저장하되
유니코드로 인코딩하는 방법을 써야 할것 같네요...
그런데 그냥 char배열에 한글이 들어가긴 하지만
이걸 wchar_t배열에 넣고싶은 이유는 뭔가요?
인코딩 문제때문에 그러시는것 맞나요?

babbab의 이미지

wchar_t으로 한글을 코맨드 아규먼트를 넣을수 있으면

switch (wargv[1])
case L'한':

같은 것도 할수 있고

grep이나 tr같은 곳에 한글을 한자리 단위씩 넣을 수 있지요.


tr ㄱ-힣 한

tr a-zA-Z a 이나 tr 0-9 n 처럼 한글도 처리가 같은 식으로 될수 있지요
그리고 '한' 이라 문자 수만 세면 한글문자의 개수도 알수 있고..

bacon의 이미지

시스템 locale을 따라서 하고싶다면 setlocale()로 locale설정한후에 mbstowcs()나 mbsrtowcs()같은걸로 변환복사하는게 가장 기본적인 방법일 것이고 , locale상관없이 특정인코딩을 사용하고 싶다면 iconv_open(),iconv(),iconv_close()사용하면 될듯 싶어요. win32환경이면 이외에도 _wmain을 사용해도 되고, MultiByteToWideChar()같은 API를 활용해도 됩니다.

babbab의 이미지

제가 하고 싶던일은 궁극적으론 qse같은 라이브러리로 유닉스 툴 프로그램들로 한글 처리를 할수 있게 하는 것이었습니다. bacon님의 abiyo.net 사이트에 있는 qse 라이브러리가 한글도 처리가 되는지요? 그리고 regex나 awk같은 걸 구현하려면 어떤 자료들을 읽어보면 많은 도움이 됩니까?

bacon의 이미지

qse라이브러리는 wchar_t를 기본으로 사용할수 있기 때문에 지금 하려는 수준의 다국어 처리는 될겁니다. lib/cmn/main.c를 보면 argc, argv관련된것도 볼수 있어요. regex나 awk도 포함되어 있습니다.

babbab의 이미지

tar ball이나 zip으로 압축되 있으면 좋겠는데...

bacon의 이미지

babbab의 이미지

합니다

babbab의 이미지

이런 코드를 개인적으로 짜봤는데...

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
 
/* multibyte string에 있는 문자수만 셈니다 */
size_t mbstrlen(char *string){
	size_t len = 0;
	int clen = 0;
	int i = 0;
 
	while(1){
		clen = mblen (&string[len], MB_CUR_MAX);
		if (clen <= 0) break;
		len += clen;
		i++;
	}
	return i;
}
 
 
/* allocate space for wargv */
void argvtowargv(wchar_t *wargv[], char *argv[], int argc){
	int cursor;
	for( cursor = 0; cursor < argc; cursor++ ){
		wargv[cursor] = malloc(mbstrlen(argv[cursor]) * sizeof (wchar_t)+1);
		mbstowcs( wargv[cursor], argv[cursor], mbstrlen(argv[cursor]));
	}
	wargv[cursor] = L'\0';
}
 
/* delete wargv */
void freewargv(wchar_t *wargv[]){
	int i = 0;
	for( i = 0; wargv[i] != L'\0'; i++)
		free(wargv[i]);
}
 
int index( wchar_t *str, wchar_t c){
#define EOS '\0'
	int cursor = 0;
	for (cursor = 0; str[cursor] != EOS; cursor++)
		if ( str[cursor] == c )
	       		return cursor + 1;
	cursor = 0;
	return cursor;
#undef EOS
}
 
int main( int argc, char *argv[] ){
 
setlocale(LC_CTYPE, "");
fwide(stdin, 1);
fwide(stdout, 1);
fwide(stderr, 1);
 
wchar_t *wargv[argc + 1];
wint_t ch;
int i;
 
argvtowargv(wargv, argv, argc);
 
/* tr 기초적인 루틴 */
 
while( (ch = getwchar()) != WEOF ){
	i = index( wargv[1], ch );
	if ( i > 0 )
		putwchar( wargv[2][i - 1] );
	else
		putwchar( ch );
}
 
freewargv(wargv);
return 0;
}
 
bash-4.2$ cc example.c
bash-4.2$ a.out 가 한
가능한가요 불가능한가요
한능한한요 불한능한한요

가능하더라고요. 그러나

wchar_t *wargv[argc + 1];
...
 
argvtowargv(wargv, argv, argc);

이 부분을

wchar_t **wargv;
....
 
wargv = argvtowargv( argv, argc );

처럼 바꾸고 싶은데 argvtowargv 안에서 wchar_t **wargv를 하고 return 이 가능한가요?
아니면 리턴하면 wargv가 쓸모없는 값을 갔나요?

그리고 이 위의 코드를 더 낳게 만들수 있는 방법이 있으면 부탁드립니다.
참고로 위의 코드가 필요하신분이 쓰신다면 전 상관 없습니다. 그냥이건 개량해선 이곤 쓰세요. ^.^

klyx의 이미지

함수내에서 변수를 조작하고 그 결과값을 가져올려면, 처음부터 변수에 대한 포인터를 넘겨주거나 함수안에서 동적할당하여 리턴하는 수밖에 없습니다.

babbab의 이미지

void *ptr = malloc(sizeof(wchar_t **));

return ptr;

란 것인가요? 예제를 올리면 고맙겠습니다.

klyx의 이미지

배열이니까 배열길이만큼 곱해줘야죠.

wchar_t **wargv = (wchar_t**)malloc(sizeof(wchar_t*)*argc);

...

return wargv;

동적할당 구문 적으신걸 보니까 포인터에는 익숙치 않으신 듯한데, 입문서에서 포인터와 동적할당에 대한 내용을 읽어보시길 추천합니다.

babbab의 이미지

^.^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.