C言語関係掲示板

過去ログ

No768 wchar_tの使用方法

[戻る] [ホームページ]
No.166

wchar_tの使用方法
投稿者---akira(2003/06/28 13:48:30)


こんにちは。akiraと申します。

wchar_tを使用して幅広文字を扱いたいのですが簡単なprintfも
動かない状況です。
wchar_tを使用するにあたって注意すべき事項等ありましたら教
えて下さい。こちらの
「No.490.日本語を含むファイル内の文字列検索」
「No.431.wchar_tについて」
を参考にさせて頂き、作成したソースを実行したのですが、何も
出力されませんでした。
以下、参考までに私の書いたソース&実行環境を掲載しておきます。
ソース(wchar_t.cc):
#include <stdio.h>
#include <locale.h>

int main(){
        wchar_t tt[128] = L"51はイチロー";
        setlocale(LC_ALL,"");
        printf("%ls\n",tt);
        return 0;
}

実行環境:
RedHat Linux 7.3
gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110)
実行結果:
prompt% gcc wchar_t.cc
prompt% ./a.out ←実行しても改行すら出力されない…
prompt% env | grep LANG
LANG=ja_JP.eucjp
prompt% locale -a | grep ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
japanese.sjis
となっています。
何処かに不備があるのだと思いますが、原因が特定出来ませんでした。
お気づきの点ありましたら、よろしくお願いします。


No.167

Re:wchar_tの使用方法
投稿者---かずま(2003/06/29 17:54:55)


#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

void dump(const char *s, const wchar_t *p, int n)
{
    int i;
    printf("%s =", s);
    for (i = 0; i < n; i++) printf(" %x", p[i]);
    printf("\n");
}

int main()
{
    char a[8] = "あいう";
    wchar_t w[8] = { 0 };
    wchar_t t[8] = L"あいう";

    setlocale(LC_ALL, "");
    mbstowcs(w, a, 8);
    dump("w", w, 8);
    dump("t", t, 8);
    printf("w = %ls\n", w);
    printf("t = %ls\n", t);
    return 0;
}
このプログラムを試してみれば分かりますが、コンパイラが、
L"あいう" を正しく処理できていないようです。
たぶん、コンパイラが setlocale を実行していないのでしょう。

ライブラリはちゃんとしているようで、コンパイルされたプログラムが、
実行時に mbstowcs で、マルチバイト文字 "あいう" をワイド文字に変換する
のは問題なく出来るようです。

No.168

Re:wchar_tの使用方法
投稿者---akira(2003/06/30 11:45:58)


akira です。

実行環境が手元に無い状況だったので連絡遅れました。
ご指摘ありがとうございます。

>このプログラムを試してみれば分かりますが、コンパイラが、
>L"あいう" を正しく処理できていないようです。
>たぶん、コンパイラが setlocale を実行していないのでしょう。

教えて頂いたソースを実行した結果です。
prompt% ./a.out
w = 3042 3044 3046 0 0 0 0 0
t = a4 a2 a4 a4 a4 a6 0 0
w = あいう
t = 陝顴陟
註rompt%

初期化時からダメだったんですね。実際に使用する時にはこの様な
初期化は行わないと思うので当面は何とかなりそうです。wchar_tが
使えない訳じゃなさそうですし、この問題は頭の隅に置いておこうと
思います(追求するのは私には困難な問題の様です…)

>ライブラリはちゃんとしているようで、コンパイルされたプログラムが、
>実行時に mbstowcs で、マルチバイト文字 "あいう" をワイド文字に変換する
>のは問題なく出来るようです。

教えて頂いた mbstowcs 等で変換して扱うとの方向で進めようと思います。
mbstowcs を用いたソースも一応報告しておきます。これで日本語を一文字ずつ
簡単に取得出来そうです。
ありがとうございました。

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(){
        char tt[] = "51はイチロー";
        wchar_t wbuf[128] = { 0 };
        char str1[5] = { 0 };

        setlocale(LC_ALL,"");
        mbstowcs(wbuf,tt,sizeof(tt));
        wctomb(str1,wbuf[0]);   /* 一文字取得. str1は必ず0で初期化しておく */
        printf("%ls\n",wbuf);
        printf("%s\n",str1);
        return 0;
}