CamomileでUnicode

1,312 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,312
On SlideShare
0
From Embeds
0
Number of Embeds
155
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

CamomileでUnicode

  1. 1. Camomile で Unicode 山形賴之  ( 独 ) 産業技術総合研究所
  2. 2. Agenda <ul><li>多言語化とは </li></ul><ul><li>Unicode とは </li></ul><ul><li>インターフェース </li></ul><ul><li>今後 </li></ul>
  3. 3. Agenda <ul><li>多言語化とは </li></ul><ul><li>Unicode とは </li></ul><ul><li>インターフェース </li></ul><ul><li>今後 </li></ul>
  4. 4. 多言語化 <ul><li>いろいろな言語のテキストを統一的に取り扱えるようにすること </li></ul><ul><li>C.f. 国際化 </li></ul><ul><ul><li>ソフトウェアをいろいろな国や地域(ロケール)で使えるようにすること </li></ul></ul><ul><ul><li>多言語化とは直交する概念 </li></ul></ul>
  5. 5. 多言語化の old type vs. new type <ul><li>Old type </li></ul><ul><ul><li>複数文字コード混在にこだわる </li></ul></ul><ul><ul><ul><li>Mule, (最近の) Ruby </li></ul></ul></ul><ul><li>New type </li></ul><ul><ul><li>全部 Unicode でいいじゃん </li></ul></ul><ul><ul><ul><li>Java, Windows, Mac etc… </li></ul></ul></ul><ul><li>Camomile は new type </li></ul>
  6. 6. New Type の Pros/Cons <ul><li>Pros </li></ul><ul><ul><li>Unicode という統一した規格のなかで議論できる </li></ul></ul><ul><ul><ul><li>文字列同士の比較 </li></ul></ul></ul><ul><ul><ul><li>ソート </li></ul></ul></ul><ul><li>Cons </li></ul><ul><ul><li>既存の文字コードとのマッピング問題 </li></ul></ul><ul><ul><ul><li>¥と﹨とか </li></ul></ul></ul><ul><ul><ul><ul><li>もともとあった問題が顕在化しただけともいえる </li></ul></ul></ul></ul>
  7. 7. Agenda <ul><li>多言語化とは </li></ul><ul><li>Unicode とは </li></ul><ul><li>インターフェース </li></ul><ul><li>今後 </li></ul>
  8. 8. 文字 <ul><li>論理的対象 (not 字体 ) </li></ul><ul><li>21bit 整数 </li></ul><ul><ul><li>100 万くらい( 0 ~10 FFFF) </li></ul></ul><ul><li>属性 </li></ul><ul><ul><li>ラテン文字、キリル文字、オガム文字 </li></ul></ul><ul><ul><li>大文字、小文字、数字 </li></ul></ul><ul><li>文字列の要素 </li></ul>
  9. 9. 文字列 <ul><li>文字のつながり </li></ul><ul><li>同一性 </li></ul><ul><ul><li>正規形( NFD,NFC,NFKD, NFKC) </li></ul></ul><ul><li>順序 </li></ul><ul><ul><li>ロケール依存 </li></ul></ul>
  10. 10. 文字列の表現 <ul><li>メモリ内 </li></ul><ul><ul><li>UTF-8: バイト列 </li></ul></ul><ul><ul><li>UTF-16:16bit 整数列 </li></ul></ul><ul><ul><li>UTF-32:32bit 整数列 </li></ul></ul><ul><li>I/O ストリーム </li></ul><ul><ul><li>UTF-8 </li></ul></ul><ul><ul><li>UTF-16-LE, UTF-16-BE, UTF-16 </li></ul></ul><ul><ul><li>UTF-32-LE, UTF-32-BE, UTF-32 </li></ul></ul>
  11. 11. 文字列の同一性(1) <ul><li>同じ文字列でも違う表現を持つことがある </li></ul><ul><li>組み合わせ文字 </li></ul><ul><ul><li>Ä   =   A + ̈ </li></ul></ul><ul><li>互換文字 </li></ul><ul><ul><li>全角半角は Unicode の思想的には同じ文字 </li></ul></ul><ul><ul><li>互換性のため別の文字としてコードされている </li></ul></ul>
  12. 12. 文字列の同一性( 2 ) <ul><li>組み合わせ文字の表現の正規化 </li></ul><ul><ul><li>NFD: できるだけ分解する </li></ul></ul><ul><ul><li>NFC: できるだけ合成する </li></ul></ul><ul><li>互換文字の「本来」の文字へのマッピング </li></ul><ul><ul><li>NFKD:↑ をした上で NFD に </li></ul></ul><ul><ul><li>NFKC:↑ をした上で NFC に </li></ul></ul>
  13. 13. 文字列の同一性( 3 ) <ul><li>NFD は Unicode のバージョンによらず不変 </li></ul><ul><li>文字列が同一とは NFD が一致すること </li></ul><ul><ul><li>NFD が同じ文字列は同等に扱うべき </li></ul></ul><ul><ul><li>でもそうなっていないことが多い </li></ul></ul><ul><ul><ul><li>Linux のファイルシステム </li></ul></ul></ul><ul><ul><ul><li>Agda </li></ul></ul></ul><ul><ul><li>Mac はちゃんとしてる? </li></ul></ul><ul><ul><ul><li>Mac のファイルシステムは NFD で比較? </li></ul></ul></ul>
  14. 14. ソート <ul><li>Multilevel sorting </li></ul><ul><ul><li>resume <<< résumé << Résumé < resumes </li></ul></ul><ul><li>Locale dependency </li></ul><ul><ul><li>A << Ä < B but A <…< Z < Ä in Danish </li></ul></ul><ul><li>Collating element </li></ul><ul><ul><li>a < b < c < ch < e in Spanish </li></ul></ul><ul><li>Context dependency </li></ul><ul><ul><li>アアダ < アーダ < イイダ < イーダ </li></ul></ul>
  15. 15. Unicode Collation Algorithm <ul><li>Collation element array を生成する </li></ul><ul><ul><li>Collation Element Table から最長一致するエントリを探す </li></ul></ul><ul><ul><li>そのエントリに与えられた重みを Array に Append </li></ul></ul><ul><li>Collation key ( binary string) を生成する </li></ul><ul><li>Collation key を比較する </li></ul>
  16. 16. Agenda <ul><li>多言語化とは </li></ul><ul><li>Unicode とは </li></ul><ul><li>インターフェース </li></ul><ul><li>今後 </li></ul>
  17. 17. 初期化 <ul><li>Config モジュール:データファイルへのパス </li></ul><ul><li>CamomileLibrary.Main.Make  に与える </li></ul><ul><li>Module Camoile = CamomileLibrary.Main.Make(Config) </li></ul><ul><li>ライブラリの実体 Camomile を得る。 </li></ul><ul><li>全部 Camomile の sub module </li></ul>
  18. 18. UChar <ul><li>UChar.t : Unicode 文字の型 </li></ul><ul><ul><li>31 bit 整数 </li></ul></ul><ul><li>だいたい Char モジュールと同じ </li></ul><ul><li>uppercase, lowercase はない </li></ul><ul><ul><li>Case mapping は文脈依存で多対多の関係 </li></ul></ul>
  19. 19. 文字列型を定義するモジュール <ul><li>シグネチャは UnicodeString.Type </li></ul><ul><li>文字列型そのもの t </li></ul><ul><li>インデックスの型 index </li></ul><ul><li>いろいろなオペレーション </li></ul><ul><ul><li>get : t -> int -> Uchar.t </li></ul></ul><ul><ul><li>look : t -> index -> UChar.t </li></ul></ul><ul><li>Buffer サブモジュール </li></ul>
  20. 20. 文字列型 <ul><li>複数ある </li></ul><ul><ul><li>UTF8 : UTF-8 でエンコードされた string </li></ul></ul><ul><ul><li>UTF16 : 16bit 整数配列 </li></ul></ul><ul><ul><li>UCS4 : 32bit 整数配列 </li></ul></ul><ul><ul><li>UText : native int の配列 </li></ul></ul><ul><ul><li>XString : 延長可能な配列 </li></ul></ul><ul><li>文字列に関する処理はすべてファンクター </li></ul>
  21. 21. UNF <ul><li>text : 文字列型 </li></ul><ul><li>正規形を求める関数 </li></ul><ul><ul><li>nfd : text -> text </li></ul></ul><ul><ul><li>nfkd : text -> text </li></ul></ul><ul><ul><li>nfc : text -> text </li></ul></ul><ul><ul><li>nfkc : text -> text </li></ul></ul><ul><li>正規形 NFD で比較する関数 </li></ul><ul><ul><li>canon_compare : text -> text -> int </li></ul></ul>
  22. 22. Locale system <ul><li>文字列 </li></ul><ul><ul><li>< 言語 >_< 国 >_<modifier> </li></ul></ul><ul><ul><ul><li>ja_JP, en_Ca など </li></ul></ul></ul><ul><li>階層的な構造をなしている。 </li></ul><ul><ul><li>ja < ja_JP < …. </li></ul></ul>
  23. 23. UCol(1) <ul><li>Variable option </li></ul><ul><ul><li>`Blanked, `Non_ignorable, `Shift_Trimmed, `Shifted </li></ul></ul><ul><ul><ul><li>空白やハイフンがどう扱われるか </li></ul></ul></ul><ul><li>Strength </li></ul><ul><ul><li>`Primary, `Secondary, `Tertiary, `Quaternary </li></ul></ul><ul><ul><ul><li>比較の精密さ </li></ul></ul></ul>
  24. 24. UCol(2) <ul><li>compare : </li></ul><ul><ul><li>?locale:string -> </li></ul></ul><ul><ul><li>?prec: UCol.precision -> </li></ul></ul><ul><ul><li>?variable: UCol.variable_option -> </li></ul></ul><ul><ul><li>text -> text -> int </li></ul></ul><ul><ul><li>テキストを比較する。 </li></ul></ul><ul><ul><li>Collation key を Lazy に生成するので、一回しか比較しないなら高速。 </li></ul></ul>
  25. 25. UCol(3) <ul><li>sort_key : </li></ul><ul><li>?locale:string -> ?prec: UCol.precision -> ?variable: UCol.variable_option -> text -> string </li></ul><ul><li>与えられたテキストから collation key を生成する。何度も比較するときはこちらのほうが早い。 </li></ul>
  26. 26. UCol(4) <ul><li>search : </li></ul><ul><li>?locale:string -> ?prec: UCol.precision -> ?variable: UCol.variable_option -> text -> text -> index -> index * index </li></ul><ul><li>検索 </li></ul>
  27. 27. CaseMap <ul><li>lowercase : ?locale:string -> text -> text </li></ul><ul><li>全部小文字に </li></ul><ul><li>uppercase : ?locale:string -> text -> text </li></ul><ul><li> 全部大文字に </li></ul><ul><li>titlecase : ?locale:string -> text -> text ABCDEF GHIJKL -> Abcdef Ghijkl </li></ul><ul><li>compare_caseless : text -> text -> int </li></ul><ul><li>compare_caseless “Abcdef” “abcdef” = 0 </li></ul>
  28. 28. Agenda <ul><li>多言語化とは </li></ul><ul><li>Unicode とは </li></ul><ul><li>インターフェース </li></ul><ul><li>今後 </li></ul>
  29. 29. 今後 <ul><li>バグ修正 </li></ul><ul><li>コードコンバーターの例外処理 </li></ul><ul><ul><li>変換できない文字を置き換える機能 </li></ul></ul><ul><li>Unicode   5.X に対応 </li></ul><ul><li>新しいデータ構造 (Rope,Zipper) </li></ul>
  30. 30. 問題点 <ul><li>独自実装を続けるべきか? </li></ul><ul><ul><li>メンテナンスが大変 </li></ul></ul><ul><ul><li>IBM   ICU などへのバインディングでいいのでは </li></ul></ul><ul><li>言語レベルの多言語化 </li></ul><ul><ul><li>パターンマッチングなど </li></ul></ul><ul><ul><li>政治的問題 </li></ul></ul><ul><ul><ul><li>みんな自分の国のことしか考えない </li></ul></ul></ul>

×