お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2012-10-22 21:54:09

futatsuya710
メンバ
登録日: 2012-08-27

C言語のmblenリファレンスの使い方

現在、C言語でマルチバイト文字を学んでいますが、mblenリファレンスでつまずいています。
OSは12.10(64bit)、gccバージョンはUbuntu/Linaro 4.7.2-2ubuntu1です。

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

int main(void)
{
    const char* str = "日本語と ASCII を MIX";
    int i, len;
    setlocale( LC_CTYPE, "jpn" );
    i = 0;
    while( str[i] != '\0' ){
        len = mblen( &str[i], MB_CUR_MAX );
        printf( "%d\n", len );
        assert( len > 0 );
        i += len;
    }
    return 0;
}

上記ファイルは、オプション無しのgccコマンドでコンパイルできるのですが、実行してみると、1文字目(日)のバイト数
len = -1(bmlen失敗時の戻り値)
でassertにひっかかり、停止します。
printf( "%lu\n", sizeof("日") );
で確認すると、64bit環境では合計4バイト。改行の1バイトを引いて、
len = 3
となるのはずなのですが。
目的は、「日」のバイト数、「本」のバイト数、「語」のバイト数、…と進めて、文末改行(\0)まで1文字ずつ処理したいのです。
マニュアルがWindows用しか無く、Linuxで同様の結果になるかは不明と、わざわざ断って書かれています。
アドバイスをいただければ幸いです。よろしくお願い致します。

オフライン

 

#2 2012-10-22 22:26:41

si
メンバ
From: hokkaido kitami, jp
登録日: 2007-01-15

Re: C言語のmblenリファレンスの使い方

環境変数にセットされている
setlocale( LC_CTYPE, "jpn" ); ->setlocale( LC_CTYPE, "ja_JP.UTF-8" );
か、セットされている変数を読む
setlocale( LC_CTYPE, "jpn" ); ->setlocale( LC_CTYPE, "" );
を試してみてください。

オフライン

 

#3 2012-10-22 22:45:31

futatsuya710
メンバ
登録日: 2012-08-27

Re: C言語のmblenリファレンスの使い方

setlocale( LC_CTYPE, "jpn" ); ->setlocale( LC_CTYPE, "ja_JP.UTF-8" );
setlocale( LC_CTYPE, "jpn" ); ->setlocale( LC_CTYPE, "" );
両方で、mblenリファレンスが3(バイト:日本語)と1(バイト:ASCII)を返してくれました。

si様、誠にありがとうございました。

オフライン

 

Board footer

Powered by FluxBB