2011-01-24 10 views
2

現在、UNIXとCOBOLで作業しており、C言語で達成する予定の受信メッセージに中国語と韓国語の文字数を指定する必要がありますmbstowsを使用したプログラム。配列内のワイド文字の数をカウントするmbsctows

私は中国の2バイト文字の正確な数を与えず、バイト数を与える次のコードを使用しています。

#include <wchar.h> 
#include <stdio.h> 
#include <locale.h> 
int main(int argc, char *argv[]) 
{ 
    if (argc != 2) /* argc should be 2 for correct execution */ 
    { 
     /* We print argv[0] assuming it is the program name */ 
     printf("usage: %s filename", argv[0]); 
    } 
    int Size = getCharCount(argv[1]); 
    printf ("THE CHAR COUNT %d", Size); 
    return Size; 
} 
int getCharCount(char *argv) 
{ 
    wchar_t *wcsVal = NULL;  
    char *mbsVal = NULL; 
    char* localeInfo; 
    setlocale(LC_ALL, "zh_CN.GB18030"); 

    /* verify locale is set */  
    if (setlocale(LC_ALL, "") == 0)  
    { 
     /*      printf(stderr, "Failed to set locale\n"); */ 
     return 1; 
    } 
    mbsVal = argv; 
    printf (" MBSVAL %s\n", mbsVal); 
    /* validate multibyte string and convert to wide character */ 

    int size = mbstowcs(NULL, mbsVal, 0); 
    if (size == -1) 
    {   
     printf("Invalid multibyte\n");   
     return 1; 
    } 
    return size; 
} 

あなたのラインあなたの親切な対応に感謝...

よろしく

AKM

答えて

1

if (setlocale(LC_ALL, "") == 0) 

は、環境変数に設定された値にロケールがリセットされます、多分中国語のキャラクターセットはもうないでしょう。それを削除するか、環境変数の値を確認してください。

+0

こんにちは、ありがとうございました。私は上記のコードをコメントアウトしようとしましたが、コードはまだ動作しませんでした。私がこのプログラムに与えようとしている入力は次のとおりです:½»Í¨ÒÐÐÐÉϺ£ÐÂÇøÖ§ÐÐこれはダブルバイトの中国語文字のバイトストリームです。それは実際には20バイトですが、私のCプログラムは中国語文字であることを認識し、2バイト文字であるため、カウントを10にします。すべての応答は非常に高く評価されます...事前におかげ... – Abhijeet

+0

設定したロケールがシステムにインストールされていますか?シェルでLC_ALLまたはLC_CTYPEのセットを実行すると、それはOSによって受け入れられますか? –

+0

こんにちは、私はプログラムを遵守し、正常に実行することができました...唯一のことは、ダブルバイト文字の入力バイトストリームに中国語文字セットをrecogizingされていないということです.....私は、 setlocale(LC_ALL、 "zh_CN.GB18030")== 0){printf( "ロケールの設定に失敗しました\ n"); 1を返します。 } – Abhijeet

3

特定の文字セットを処理するために、ロケールをプログラマが選択した特定の値に設定すると、誤った使用法になります。実装固有のロケール名だけでなく、彼らはまた、ユーザーまたはシステムの文字エンコーディングを反映することを意図しています。

特定の文字エンコーディングをプログラムで処理する必要がある場合は、この目的のためにiconvインターフェイスが存在します。 iconv_open("WCHAR_T", "GB18030");を使用して変換ディスクリプタを取得し、一度に数kbをスタック上の廃棄バッファに変換し、各実行で得られた出力文字の数を合計します。

+0

私は 'iconv'はPOSIXであり、C言語ではないことを知っていますが、OPの質問では' setlocale'このコードはUnix系のシステム、おそらくGNU/Linux上で動作していることをお勧めします。また、 'setlocale'への移植不可能な引数と違って、あなたのシステムに' iconv'がないなら、あなた自身の 'iconv'ライブラリに入れることができます。 –

関連する問題