お知らせ

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

#1 2017-07-29 00:13:13

yaneno-suzume
メンバ
From: 名古屋
登録日: 2013-06-30

日本語ReMix のロケールでタイ語の表示

いつもお世話になり、ありがとうございます。

Ubuntu 16.04 LTS 日本語ReMix を使っていますが、
デフォルトのロケールで GNOME 端末を使ったとき
タイ語が正しく表示できるものか知りたいのです。

というのは、ncurses を使ったテスト・プログラム(後述)で、
タイ語の文字列を表示し、表示した文字列を読み込むと、
一部の文字が読み取られずスキップされる現象が起きるので、
原因を切り分けたいためです。

(1) テスト・プログラムのバグか
(2) ロケールの設定によるものか
(3) ncurses ライブラリの不具合か

どれなのかご意見いただけませんでしょうか。

※タイ語を使ったのは複合文字のテストのため。
 普段は日本語で Ubuntu を使っているので、
 タイ語を扱うのはこれが初めてです。
 タイ文字については、ウィキペディア日本語版を参照しました。

※ロケールを変更した記憶はないので、デフォルト状態と思います。
~$ locale
LANG=ja_JP.UTF-8
LANGUAGE=ja
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

テスト・プログラム inwstr_test.c(C言語)を下に載せておきます。
よろしくお願いします。

コード:

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

// gcc -I/usr/include/ncursesw/ -D_XOPEN_SOURCE_EXTENDED inwstr_test.c -lncursesw

int main()
{
// WINDOW *win1, *win2;
int ret;
// cchar_t cc1, cc2;
wchar_t wc[12+1];
int i;

setlocale(LC_ALL,"");
initscr();
cbreak(); noecho(); halfdelay(100);

//display value of constants
/*
printw("FALSE  %d\n", FALSE  );
printw("TRUE  %d\n", TRUE  );
printw("false  %d\n", false  );
printw("true  %d\n", true  );
printw("OK  %d\n", OK  );
printw("ERR  %d\n", ERR  );
*/


//display size
printw("%s\n", "これはcurs_inwstr確認用プログラムです"  );
printw("sizeof(wchar_t)  %d\n", sizeof(wchar_t)  );
printw("%s\n", "กรุงเทพมหานคร"  );
printw("%s\n", "สักกะทัตติยวิษณุกรรมประสิทธิ์"  );
//get string
ret = mvinnwstr(0,0,wc,12);

//put result
move(6,0);
printw("mvinnwstr(0,0,wc,12) =  %d\n", ret );
addwstr(wc);
addch('\n');

ret = mvinnwstr(3,0,wc,12);
move(8,0);
printw("mvinnwstr(2,0,wc,12) =  %d\n", ret );
addwstr(wc);
addch('\n');
for (i=0; i<=12; ++i)
    printw("%04x\n", wc[i]  );


refresh();
getch();

endwin();
return(0);
}

結果の抜粋(9文字目がスキップされ、10文字目を読んでいる)

0e2a
0e31
0e01
0e01
0e30
0e17
0e31
0e15
0e15
0e34
0e22
0e29
0000

オフライン

 

Board footer

Powered by FluxBB