
Ubuntu日本語フォーラム

ログインしていません。
ページ: 1
ubuntu-ja-7.04-desktop-i386 に gtk+extra-2.1.1.tar.gz と libscigraphica-2.1.1.tar.gz
と scigraphica-2.1.0.tar.gz および 依存関係で必要とされるパッケージをインストールし、日本語
環境で、動作していました。しかし、ubuntu-ja-7.10-desktop-i386 で同じようにインストールしても
動作中に、Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text() という
警告が出ます。
システム -> システム管理 -> 言語サポート と辿って、英語環境に変更すると、警告は出なくなります。
7.04 では、日本語環境で動作させても警告は出なかったのに、7.10 では、日本語環境で動作させると警告
が出るようになってしまいました。
日本語環境で警告が出ないようにするには、どうすれば良いのか、ご教授宜しくお願い致します。
オフライン
7.04 では pango の警告が出ないが、7.10 では pango の警告が出る
と報告しましたが、7.04 では フォルダ名に日本語が使われてないためで
あることが分かりました。
7.04 でもフォルダ名に日本語を使うと、pango の警告が出ます。
pango の警告が出ないようにするには、どのようにすれば、よいのでしょうか?
オフライン
ubuntu_novice による投稿:
7.04 でもフォルダ名に日本語を使うと、pango の警告が出ます。
pango の警告が出ないようにするには、どのようにすれば、よいのでしょうか?
日本語を使うと警告がでるのがはっきりしているのでしたら、日本語を使わなければいいのではないでしょうか?
オフライン
7.10 の日本語環境では、ホームページのデスクトップ等のディレクトリ名も日本語
です。
日本語環境で使用するので、pango の警告が出ないようにしたいのです。
オフライン
gdm から言語を英語にしてログインしてください。ログイン後にディレクトリ名をリネームするか聞かれるので英語名にリネームしてください。
ただしディレクトリ内にファイルが存在すると古いディレクトリが残ってしまうようです。
オフライン
たぶん、参考になるのでは。
http://forum.ubuntulinux.jp/viewtopic.php?pid=7185
~/.config/user-dirs.dirsを編集する方法が、一番簡単かも。
最後の編集者: HiroKws (2008-07-13 06:19:03)
オフライン
mizuno 様
HiroKws 様
ご教示頂きまして有難う御座います。ディレクトリ名を英語に変換すれば、Pangoの警告は出なくなるの
ですが、ディレクトリ名が日本語のままで使用したく、いろいろ調べていて、返事が遅くなりました。
gtk+extra-2.1.1/gtkextra/gtkiconlist.c の中の
set_labels(GtkIconList *iconlist, GtkIconListItem *icon, const gchara *label) という
関数を実行したところで、Pangoの警告が出ることが分かりました。
英語の UTF-8 のコード長は 1バイトであるのに対して、日本語の UTF-8 のコード長は 3バイト
であるために、日本語では、警告が出るようです。
gtk+2 では UTF-8 コードであれば、多国言語を使用出来ると、どこかで見たような気がするのですが
gtk+extra-2.1.1 は、多国言語に対応していないのでしょうか?
gtkiconlist.c には、#include <pango/pango.h> という行があるのですが?
オフライン
ubuntu_novice による投稿:
gtk+2 では UTF-8 コードであれば、多国言語を使用出来ると、どこかで見たような気がするのですが
gtk+extra-2.1.1 は、多国言語に対応していないのでしょうか?
gtkiconlist.c には、#include <pango/pango.h> という行があるのですが?
症状からの推測でしかないのですが、GtkExtraがGtkのpango_layout_set_text()の第2引数に「正しいUTF-8文字列」を渡していないということなんですよね?
そうであれば、gtkiconlist.cでpango_layout_set_text()を呼び出しているところ、もしくはpango_layout_set_text()を呼び出す関数を呼び出しているところを特定し、まずはその引数が正しいUTF-8文字列かどうかを確認し、場合によってはGtkExtraのソースコードを修正しなくてはいけないと思います。
SciGraphica/GtkExtraはともに古いソフトウェア(しかもここ数年は更新された形跡がない?)ようですので、十分に多国語対応がおこなわれていないのかもしれません。
オフライン
Shibata 様
ご返事頂いていたのに盆休みで返事が遅くなり申し訳ありません。
set_labels関数の全文は下記のようになっています。
static void
set_labels(GtkIconList *iconlist, GtkIconListItem *icon, const gchar *label)
{
gint text_width;
gint point_width;
gint max_width;
gchar *entry_label = NULL;
gint n, space;
if(!label) return;
entry_label = (gchar *)g_malloc(strlen(label) + 5);
entry_label[0] = label[0];
entry_label[1] = '\0';
text_width = STRING_WIDTH(icon->entry, icon->entry->style->font_desc, label);
point_width = STRING_WIDTH(icon->entry, icon->entry->style->font_desc, "X");
max_width = iconlist->text_space;
for(n = 0; n < strlen(label); n++){
space = strlen(label) - n + 1;
if(space > 3 &&
STRING_WIDTH(icon->entry, icon->entry->style->font_desc, entry_label) +
3 * point_width > max_width)
break;
entry_label[n] = label[n];
entry_label[n + 1] = '\0';
}
if(strlen(entry_label) < strlen(label))
sprintf(entry_label,"%s...", entry_label);
icon->entry_label = g_strdup(entry_label);
g_free(entry_label);
}
上記 set_labels関数の中の20行にある
for(n = 0; n < strlen(label); n++){ 以下の
for文では n++ で1バイトづつ増分して処理しています。
従って、3バイトで構成される日本語では、entry_label に不完全なコードが入ったままで
STRING_WIDTH(icon->entry, icon->entry->style->font_desc, entry_label)
という関数が実行される場合があります。その時に、警告が出ているようです。
そこで、UTF-8 では、文字の先頭は、「0xxxxxxx」あるいは「11xxxxxx」であることを利用して、
下記のように、if( (label[n] & (gchar)0xc0) == (gchar)0xc0 && n != 0 || (label[n] & (gchar)0x80) == (gchar)0x00 )
の判定を入れて、文字の切れ目を見つけて、一文字単位に処理するように編集すると、Pangoの警告は出なくなります。
space = strlen(label) - n + 1;
if( (label[n] & (gchar)0xc0) == (gchar)0xc0 && n != 0 || (label[n] & (gchar)0x80) == (gchar)0x00 ) <--- 追加した
if(space > 3 &&
しかし、当方は、プログラムの知識が乏しく、for文で何をやっているのかさっぱり理解出来ていません。そこで、教えて頂たいのですが
1、for文で何をやっているのでしょうか?
2、if( (label[n] & (gchar)0xc0) == (gchar)0xc0 && n != 0 || (label[n] & (gchar)0x80) == (gchar)0x00 ) を
追加するのは、正しいのでしょうか?
3、追加したことにより、本来の for文でやろうとしていたことを阻害してはいないのでしょうか?
尚、STRING_WIDTH 関数は下記のようになっています。
static inline guint STRING_WIDTH(GtkWidget *widget,
PangoFontDescription *font, const gchar *text)
{
PangoRectangle rect;
PangoLayout *layout;
layout = gtk_widget_create_pango_layout (widget, text);
pango_layout_set_font_description (layout, font);
pango_layout_get_pixel_extents (layout, NULL, &rect);
g_object_unref(G_OBJECT(layout));
return rect.width;
}
最後の編集者: ubuntu_novice (2008-08-23 12:15:02)
オフライン
今から述べることは、プログラミングの素人の、しかも他の部分を見ずに、ubuntu_noviceさんのコメントを見ただけの推測であることを、まずは把握しておいてください。
set_labels関数では、ある固定幅(max_width)の領域に、特定の文字列(label)を表示させようとしています。で、幅が固定ですのでlabelが大きすぎると、フォントによってはあふれる可能性があります。そこで、for文では、
・labelのうち先頭からn+1文字までをentry_labelに格納(n=0の分はforの外で、n=1以降の部分はforの最後で行っている)
・STRING_WIDTHでentry_labelの表示したいフォント(icon->entry->style->font_desc)での表示幅を計算
・その幅が、max_widthを越えるようなら、そこまででfor文を終了、外でentry_labelの最後に"..."を付加
・残り文字数(space)が3以下なら、溢れてでも強引に表示
というようなことをやっています。たぶん。
ubuntu_noviceさんのUTF-8の判定方法が正しいかどうかはわかりませんが、その判定に加えて、
・残り文字数(space)の計算方法
・entry_labelにlabelのデータをコピーする部分
などにも手を加える必要があると思います。ただ、このへんの多バイト文字を想定した、バイト数と文字数の換算なんかは、ライブラリ関数とか用意されていると思いますので、そっちを探して使った方が良いのではないでしょうか。
オフライン
ページ: 1