mots quotidiens.
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp by hns, version 2.10-pl1.

先月 2024年04月 来月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

2011年01月29日() [n年日記]

#1 Yee Whye Talk終了

Talkは無事終了しました。
Yee Whyeの他の多くのTalkと違い, 今回は partition の分布としての 厳密さを妥協しない話で, 個人的には非常に良かったんじゃないかと思いました。
最前列で鋭い質問を連発されていた方が, 最初だけ一瞬誰だかわからなかったの ですが(普段と違って眼鏡を掛けてらしたので), 田中先生だった件。w

NTT外からも沢山来ていただき, 多分25〜30人くらいはいたのではないか と思います。僕も含めて, 刺激になれば良かったのではないかと思います。
現在進行中の話だったのでスライドは公開されないと思いますが, ポイントは

などでしょうか。
昼食時に聞いた話では, 実装には2ヶ月掛かっているのだそうです。凄い。

最後に帰る前に所長室で, Gatsbyで以前一緒だった上田さんと研究の話をして いましたが, 正直写真を撮りたいくらいでした。


2009年01月29日(木) [n年日記]

#1 wchar_t & ICU

内部で先月Talkをした時に, 渡辺さん が, C/C++でこういう文字タイプの判別を行うにはIBMの ICU を使うといいと教えてくれた。

ICUはUnicodeを扱うフリーソフトで, 基本的にUTF-16を扱うもののようなので, 内部表現がUTF-16になるglibcでは, そのまま wchar_t や wstring の要素を渡すこと ができるようです。
ICUには正規表現やcharacter iteratorなど様々な機能があるようですが, C/C++で文字がひらがな/カタカナ/漢字かどうかを判別したいということは 自然言語処理でよくあるかも知れないのと, あまり検索しても方法を紹介している ページはないようなので, 自分用のメモも兼ねて。

文字がひらがな/カタカナ/漢字(中国語もここ)のどれなのかは, それぞれUnicodeの ブロックが 異なるので, uchar.h に含まれる ublock_getCode() を使って, 基本的には以下の ようにすればよいようです。(実際の僕のコードではもう少し色々やっています)

#include "unicode/uchar.h"
#include "unicode/utypes.h"
#include "unicode/uscript.h"

wtype_t
wtype (wchar_t w)
{
        UChar32 c = (UChar32) w;
        UBlockCode bc = ublock_getCode(c);
        UErrorCode err;

        if (bc == UBLOCK_HIRAGANA)
                return U_HIRAGANA;
        else if (bc == UBLOCK_KATAKANA)
                return U_KATAKANA;
        else if (bc == UBLOCK_CJK_UNIFIED_IDEOGRAPHS)
                return U_HANJI;
        else if (bc == UBLOCK_HALFWIDTH_AND_FULLWIDTH_FORMS)
        {
                UScriptCode uc = uscript_getScript(c, &err);
                if (uc == USCRIPT_KATAKANA)
                        return U_KATAKANA;
                else
                {
                        if (u_getIntPropertyValue(c, UCHAR_WORD_BREAK)
                            == U_WB_KATAKANA)   /* "-" in hankaku */
                                return U_KATAKANA;
                }
        }
}
注意すべきなのは最後の半角カナの場合で, これはブロック Halfwidth_And_Fullwidth_Forms (FF00-FFEF)に入っていますが, ここにはハングルの半角カナ(というのがあるらしい)も同時に入っているので, カタカナかどうかを判別するには, さらにScript属性を見て, USCRIPT_KATAKANA であれば(半角)カタカナ, という判別をしています。

さらに, 実はよく見ると半角カナの"ー"はScript属性がカタカナでないようで(!) このままではカタカナに分類されません。
このためには, "ー"のProperty をよく見ると, Word_Break 属性がKatakanaになっているので, さらにここを見て 判別してやります。(Word_Break属性を直接取る関数はないようなので, u_getIntPropertyValue で UCHAR_WORD_BREAK を取り出します。)
これでめでたくwchar_tの文字が例えばひらがな/カタカナ/漢字かどうかを判別 できて, 上のコードでOKのようです。 これで 2008/9/17の日記 のように, 自分で文字コードを直書きする必要がなくなり ました。

メモ: 各ブロックやプロパティにどんな文字が含まれているかは, http://unicode.org/cldr/utility/properties.jsp を見ると全部わかるようです。


2 days displayed.
タイトル一覧
カテゴリ分類
 なかのひと
Powered by hns-2.10-pl1, HyperNikkiSystem Project