
Ubuntu日本語フォーラム

ログインしていません。
現在、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で同様の結果になるかは不明と、わざわざ断って書かれています。
アドバイスをいただければ幸いです。よろしくお願い致します。
オフライン
環境変数にセットされている
setlocale( LC_CTYPE, "jpn" ); ->setlocale( LC_CTYPE, "ja_JP.UTF-8" );
か、セットされている変数を読む
setlocale( LC_CTYPE, "jpn" ); ->setlocale( LC_CTYPE, "" );
を試してみてください。
オフライン
setlocale( LC_CTYPE, "jpn" ); ->setlocale( LC_CTYPE, "ja_JP.UTF-8" );
setlocale( LC_CTYPE, "jpn" ); ->setlocale( LC_CTYPE, "" );
両方で、mblenリファレンスが3(バイト:日本語)と1(バイト:ASCII)を返してくれました。
si様、誠にありがとうございました。
オフライン