A Reintroduction To Ruby M17 N

5,506
-1

Published on

東京RubyKaigi03 成瀬の発表
「A reintroduction to Ruby M17N」
http://nalsh.jp/pub/A%20reintroduction%20to%20Ruby%20M17N.pptx

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,506
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
26
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

A Reintroduction To Ruby M17 N

  1. 1. A reintroduction to Ruby M17N<br />NARUSE, Yui<br />
  2. 2. 序<br />今日はみなさんに日本を生まれた事を後悔してもらいに来ました<br />の、つもりだったのだが……<br />「地球に生まれた事に」になってしまった……<br />
  3. 3. 話す事・話さない事<br />話す事<br />文字コード<br />Ruby M17N<br />話さない事<br />メッセージの切り替え<br />時刻・時間とか通貨とか<br />
  4. 4. コンピュータで文字を扱う<br />表示・印刷<br />字形 (グリフイメージ)<br />字体 (グリフ)<br />書記素クラスタ (grapheme cluster)<br />コードポイント 符号化文字集合<br />(コードユニット) (UTF-16/32)<br />バイト 文字符号化方式<br />処理・格納<br />
  5. 5. 「文字コード」とは<br />「文字」をコンピュータで扱う仕組みのうち、比較的低層の部分<br />つまり、グリフやフォントよりちょっと下まで<br />扱う文字を決め、番号を振る<br />文字列を番号列、バイト列、ビット列にする<br />
  6. 6. 文字集合<br />Abstract Character Repertoire<br />どのような文字を扱うか<br />ある文字とある文字が同じか違うかの決定<br />何文字扱うか、扱えるか<br />必要な文字 vs. メモリサイズ・性能<br />
  7. 7. 何を扱うか<br />アラビア数字<br />アルファベット大文字 ― 6bit<br />アルファベット小文字 ― 7bit<br />カタカナ ― 8bit<br />ひらがな<br />漢字<br />絵文字<br />など ― 16bit<br />などなどなど ― 21bit<br />
  8. 8. 文字の同定<br />ある文字とある文字が等しいかどうかの決定<br />包摂規準 (その文字の射程範囲の決定)<br />何が一文字か e.g. リガチャ「ffi」<br />典拠の確保―いい加減だと幽霊文字が混じったり、重複したり<br />e.g. 妛𡚴 「あけんばら」で検索<br />
  9. 9. 字形の違い<br />色々な「フォント差」「書体差」<br />aaaaaaaaa<br />「g」「g」メガネg「l」「l」ループL<br />言 言言<br />
  10. 10. 字体の違い<br />JISでは同じだがUnicodeでは別<br />「高」と「髙」 「吉」と「𠮷」<br />JISでもUnicodeでも同じコードポイント<br />
  11. 11. 符号化文字集合<br />CCS / Coded Character Set<br />文字集合を構成する「文字」、一つ一つに番号を振ったもの<br />一般にはこの番号を「コードポイント」<br />Unicode の場合<br />「Unicode Scalar Value」<br />「あ」->U+3042 (Unicode)<br />JIS X 0208<br />「ビット組合せ」や「区点コード」<br />「あ」->04区02点 (JIS X 0208)<br />
  12. 12. 符号化文字集合の例<br />ASCII 英数記号<br />ISO/IEC 8859-1 アクセント付き文字<br />JIS X 0201 いわゆる半角カナ<br />JIS X 0208 第一・第二水準漢字など<br />JIS X 0212 補助漢字など<br />JIS X 0213 第三・第四水準漢字など<br />Unicode いろいろ<br />
  13. 13. JIS X 0208<br />http://www.kanji.zinbun.kyoto-u.ac.jp/~yasuoka/kanjibukuro/japan.html<br />
  14. 14. 文字符号化方式<br />CES, Character Encoding Scheme<br />符号化文字集合の番号をバイト列に変換する方式<br />Shift_JIS<br />「あ」 -> 04区02点 -> "x82¥xA0"<br />「い」 -> 04区04点 -> "x82xA2"<br />UTF-8<br />「あ」 -> U+3042 -> "xE3x81x82"<br />「い」 -> U+3044 -> "xE3x81x84"<br />
  15. 15. エンコーディング<br />encoding (W3C)<br />charset (IETF)<br />あるバイトデータを解釈するには、「文字符号化方式」と「符号化文字集合」を共に特定する必要<br />Shift_JIS<br />"x82¥xA0" -> 04区02点 -> 「あ」<br />UTF-8<br />"xE3x81x82" -> U+3042 -> 「あ」<br />
  16. 16. IANA Charset<br />各々のエンコーディングに名前を付けて登録管理<br />インターネット上に流すデータは登録されてる必要<br />一部のエンコーディングは実態と乖離も<br />http://www.iana.org/assignments/character-sets<br />ISO-2022-JP<br />EUC-JP<br />Shift_JIS<br />Windows-31J<br />
  17. 17. 用語の整理<br />charset<br />Character setが由来と思われるため、「文字集合」の意味に感じられるが、用法としてはencodingと同じ<br />文字コード<br />文字集合<br />encoding<br />ある文字のコードポイント<br />
  18. 18. Unicode用語集<br />UCS-2は文字集合ではなくencoding<br />ISO/IEC 10646の定義13.1 Two-octet BMP form (UCS-2)<br />This coded representation form permits the use of characters from the Basic Multilingual Plane with each character represented by two octets.<br />Unicodeの定義<br />“UCS-2. ISO/IEC 10646 encoding form: Universal Character Set coded in 2 octets, limited to the Basic Multilingual Plane.”<br />http://www.unicode.org/glossary/#UCS_2<br />
  19. 19. History of I18N<br />Internationalization, 国際化<br />I .{18} N<br />I18N<br />S12N (Scherpenhuizenさんが元祖)<br />http://blog.miraclelinux.com/yume/2007/01/i18n_8bc0.html<br />
  20. 20. 略語解説<br />L10N (Localization) (地域化)<br />それぞれの地域・言語に適したようにすること<br />ある言語に対応すること<br />cf. nls (national language support)<br />I18N (Internationalization) (国際化)<br />地域化しやすいように、あらかじめソフトウェア側を抽象化しておくこと<br />言語を切り替えて使用できるようにすること<br />M17N (Multilingualization) (多言語化)<br />複数の言語などで利用するためにローカライズ<br />同時に複数の言語を扱えるように (Ruby)<br />
  21. 21. 国際化というからには<br />元は国際対応じゃない<br />最初はどうだったのか?<br />
  22. 22. 始まりはASCII<br />1970年頃<br />ASCII以前から文字コードはあった<br />ASCIIは電信の遺産を継承している<br />まぁ情報通信的にはASCIIから始まる<br />ていうかISO/IEC 646でしょ<br />EBCDICのことを忘れないでください<br />
  23. 23. http://www.ecma-international.org/publications/standards/Ecma-006.htm<br />ECMA-6 IRV(≒ ASCII)<br />
  24. 24. ASCIIに含まれる文字種<br />アラビア数字<br />アルファベット大文字<br />アルファベット小文字<br />記号<br />全94文字<br />
  25. 25. 文字が足りない<br />アクセント付きアルファベット(ISO 8859シリーズ) 577文字<br />いわゆる半角カタカナ(JIS X 0201) 56+7文字<br />漢字など(JIS X 0208) 6355+524文字<br />
  26. 26. ASCIIを拡張しよう<br />JIS X 0201 (ASCII 亜種・8bit化)<br />ISO-8859-1 (8bit化)<br />ISO-2022-JP (エスケープシーケンス)<br />SJIS / EUC / UTF-8 (マルチバイト)<br />UTF-16 (16bit化)<br />UTF-32 (32bit化)<br />
  27. 27. 拡張したよ!<br />ASCII-8BIT, UTF-8, US-ASCII, Big5, Big5-HKSCS, Big5-UAO, CP949, Emacs-Mule, EUC-JP, EUC-KR, EUC-TW, GB18030, GBK, ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10, ISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16, KOI8-R, KOI8-U, Shift_JIS, UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE, Windows-1251, IBM437, IBM737, IBM775, CP850, IBM852, CP852, IBM855, CP855, IBM857, IBM860, IBM861, IBM862, IBM863, IBM864, IBM865, IBM866, IBM869, Windows-1258, GB1988, macCentEuro, macCroatian, macCyrillic, macGreek, macIceland, macRoman, macRomania, macThai, macTurkish, macUkraine, stateless-ISO-2022-JP, eucJP-ms, CP51932, GB2312, GB12345, ISO-2022-JP, ISO-2022-JP-2, CP50221, Windows-1252, Windows-1250, Windows-1256, Windows-1253, Windows-1255, Windows-1254, TIS-620, Windows-874, Windows-1257, Windows-31J, MacJapanese, UTF-7, UTF8-MAC<br />Ruby 1.9.2 サポート予定分<br />
  28. 28. どうしてこうなった?<br />制約の中でベストを尽くそうとするため<br />メモリ容量<br />処理速度<br />プログラミングの複雑さ<br />必要な文字の違い<br />ベンダ間の調整不足<br />結局、ほっとけば文字コードは増える<br />->統一への努力<br />
  29. 29. どうしよう……?<br />敵を知るしかない<br />知った上で個別撃破<br />たいていの罠は「歴史的経緯」<br />歴史を知る事が重要<br />
  30. 30. ISO 646―分裂の始まり<br />ISO/IEC 646<br />ASCIIのISOバージョン<br />一部の文字の置き換えを認めている<br />択一 #/£ $/¤<br />任意 [ \ ] ^ { | } ~<br />
  31. 31. ISO 646の各国ごとの違い<br />http://ja.wikipedia.org/wiki/ISO_646<br />http://en.wikipedia.org/wiki/ISO/IEC_646<br />
  32. 32. ISO 646 文字の意味論の違い<br />赤字は文字合成を許すもの。例: <A BS “>-> Ä<br />
  33. 33. まだまだ足りない<br />アクセント付きアルファベット(ISO 8859シリーズ) 577字<br />いわゆる半角カタカナ(JIS X 0201) 56+7字<br />漢字など(JIS X 0208) 6355+524字<br />
  34. 34. ISO/IEC 2022<br />Character Code Structure andExtension Techniques<br />ISO 646を拡張した文字コードの作り方を定める<br />具体例<br />ISO 8859シリーズ (8bit化)<br />ISO-2022-JP (エスケープシーケンス)<br />EUC系 (多バイト)<br />シフトJISやUTF-8などは違う<br />
  35. 35. http://www.ecma-international.org/publications/standards/Ecma-035.htm<br />ECMA-35(≒ ISO/IEC 2022)<br />
  36. 36. ISO/IEC 2022の構造<br />x20<br />|<br />x7F<br />xA0<br />|<br />xFF<br />A<br />ESC ( BA<br />漢<br />ESC $ B 4A<br />x8E (SS2)<br />JIS X 0208<br />US-ASCII<br />EUC-JP G1<br />EUC-JP G2<br />JIS X 0212<br />EUC-JP G3<br />JIS X 0201<br />ローマ字<br />JIS X 0201<br />片仮名<br />JIS X 0213<br />
  37. 37. ISO 2022のバイト列<br />どの文字集合を使うか指定<br />バッファへの指示 (stateful)<br />バッファからの呼び出し<br />シングルシフト<br />ロッキングシフト(stateful)<br />その文字集合のどの文字を使うか指定<br />
  38. 38. ISO/IEC 2022系の欠点<br />状態を持つ事 (持たないものもあるが)<br />文字コードがどんどん増える<br />文字コードごとに別のコードが必要になる<br />規格が複雑になってしまった<br />
  39. 39. Unicode<br />1986年頃からXeroxとAppleが始める<br />1988年ISOにUnicode 88を持ち込む<br />1991年1.0 (漢字なし), 1992年1.0.1<br />1993年1.1でISOと同期<br />1996年2.0, UTF-8とUTF-16登場<br />2002年3.2でJIS X 0213対応<br />2010年末6.0で絵文字対応?<br />
  40. 40. Design Of Unicode<br />文字コードから地域・言語を分離<br />1つのUnicode文字列には複数の言語を混ぜられない<br />フラットな空間に全ての文字を入れる<br />16bit -> 32bit<br />UTF-16の制限から1,114,112文字種<br />用字系が同じならば文字統合<br />
  41. 41. 漢字統合<br />plaintext+encodingからフォントを決定できない<br />
  42. 42. 一見大きな問題に見えるが<br />トルコ語では”i”.upcase->“İ”<br />ドイツ語では”ss”.upcase->“ß”<br />実はASCIIの範囲も言語の指定が必要<br />
  43. 43. There Ain't No Such ThingAs Plain Text.<br />Joel Spolsky<br />http://www.joelonsoftware.com/articles/Unicode.html<br />TEXT needs<br />Encoding and Language<br />
  44. 44. Legacy Encoding<br />Unicode以前の文字コードたち<br />Unicode時代のプログラムで動かすには変換して取り込む必要<br />変換表をどうするか?<br />人によって変換表が異なると問題<br />
  45. 45. ご存じですか? CP932<br />他の話がさっぱりでも「CP932の存在」だけは知って帰って頂きたい<br />Windows Codepage 932<br />IBM Codepage 932とは微妙に違う<br />Windows版シフトJIS<br />正式名称: Windows-31J<br />JIS規格由来のShift_JISと変換表が異なる<br />CP932を用いるといくつかの問題を回避可能<br />
  46. 46. 円記号問題「」<br />問題の始まり<br />ISO 646系の0x5C<br />JIS X 0201 円記号 ¥<br />ASCII バックスラッシュ \<br />
  47. 47. ISO 646の各国ごとの違い<br />http://ja.wikipedia.org/wiki/ISO_646<br />http://en.wikipedia.org/wiki/ISO/IEC_646<br />
  48. 48. どこで問題になるか?<br />まずは表示上の問題<br />「円記号」のつもりが「バックスラッシュ」で表示<br />JIS X 0201データをASCII端末で表示<br />「バックスラッシュ」 のつもりが「円記号」で表示<br />ASCIIのデータをJIS X 0201端末で表示<br />取り違えると「文字化け」する<br />
  49. 49. 制御コードとの衝突<br />バックスラッシュは制御記号扱い<br />C言語のエスケープ記号<br />MS-DOSのパス区切り文字<br />同じ0x5Cの円記号も同じ扱いに<br /> <br />e 「えんいー」<br />
  50. 50. シフトJISと円記号問題<br />「表」はシフトJISでは x95 x5C<br />シフトJISを理解しないプログラムで問題<br />% cat yen.rb<br />puts "表"<br />% ruby1.8 ./yen.rb<br />./yen.rb:1: unterminated string meets end of file<br />
  51. 51. 理由<br />puts "表"<br />puts "x95x5C"<br />p u t s " x95 "<br />puts "x95"<br />引用符を閉じていない扱いに!<br />unterminated string meets end of file<br />
  52. 52. 回避方法<br />Ruby 1.8の場合 -Ks<br />Ruby 1.9の場合 magic comment<br />% cat yen.rb<br />#coding:Windows-31J<br />puts "表"<br />% ruby1.8 -Ks ./yen.rb<br />表<br />
  53. 53. Unicodeと円記号<br />シフトJISの0x5CをUnicodeに変換<br />Shift_JISの0x5Cは本来JIS X 0201<br />JIS X 0201扱いなら、U+00A5<br />ASCII扱いなら、U+005C<br />EUC-JPの0x5CはASCIIのはず<br />
  54. 54. それぞれの変換の問題<br />ASCII: 0x5CがU+005Cになると、<br />表示がバックスラッシュになる?<br />JIS X 0201: 0x5CがU+00A5になると、<br />パス区切りではなくなる<br />ソースコードのエスケープじゃなくなる<br />
  55. 55. Windowsでの解決<br />0x5CはU+005Cに変換する (ASCII風)<br />日本語用フォントでは、U+005Cのグリフを「円記号」にする<br />5C = U+005C : REVERSE SOLIDUS (YEN SIGN)<br />http://msdn.microsoft.com/en-us/goglobal/cc305152.aspx<br />韓国のウォンでも同様の問題<br />5C = U+005C : REVERSE SOLIDUS (WON SIGN)<br />http://msdn.microsoft.com/en-us/goglobal/cc305154.aspx<br />
  56. 56. 波ダッシュ問題「~」<br />JIS X 0208: U+301C(WAVE DASH)<br />CP932: U+FF5E(FULLWIDTH TILDE)<br />問題<br />WindowsはU+301CをシフトJISに戻せない<br />CP932の変換テーブルにないから<br />XP添付のフォントでU+301Cを表示しようとすると、誤ったグリフになる「〜」(Vista以降では修正済み)<br />
  57. 57. Shift_JISとCP932の違い<br />
  58. 58. 機種依存文字<br />マイクロソフト標準キャラクタセット<br />NEC特殊文字<br />①Ⅰ㌶など<br />IBM拡張文字<br />ⅰ¦﨑髙など<br />NEC選定IBM拡張文字<br />
  59. 59. CP932風別エンコーディング<br />CP51932<br />Windows版日本語EUC<br />CP932にある機種依存文字がある<br />JIS X 0212がない<br />Web上の「EUC-JP」はこれかも<br />CP50221<br />Windows版ISO-2022-JP<br />いわゆる半角カナがある<br />CP932にある機種依存文字がある<br />
  60. 60. シフトJIS関連の名前<br />「シフトJIS」 マイクロソフトウェア・アソシエイツが名付けた。総称として用いられる<br />「Shift-JIS」「Shift JIS」 「シフトJIS」の英語表記<br />「MS漢字コード」 開発者の山下による命名<br />「SJIS」 Unix方面での名前<br />「Shift_JIS」 IANA Charsetでの名前<br />「シフト符号化表現」 JIS X 0208:1997 附属書1<br />「Shift_JISX0213符号化表現」 JIS X 0213:2000 付属書1<br />「Shift_JIS-2004符号化表現」 JIS X 0213:2004付属書1<br />「CP932 (Windows Codepage 932)」 Microsoft実装<br />「Windows-31J」 CP932のIANA Charsetでの名前<br />「IBM CP932」 MS CP932とは別物<br />「IBM943」 MS CP932とおおむね同じ、JIS X 0201<br />「IBM943C」 MS CP932と同じ、ASCII<br />
  61. 61. 日本語EUC関連の名前<br />「日本語EUC (圧縮形式)」 情報交換用のEUC、普通はこれ<br />「日本語EUC (固定長形式)」 System V での内部表現<br />「eucJP」 UI-OSF日本語環境実装規約で定義<br />「EUC-JP」 IANA Charsetでの名前<br />「UJIS」 ΣOSでの名前<br />「CP51932」 Internet Explorerでの日本語EUC実装<br />「eucJP-ms」 TOG/JVC CDE/Motif 技術検討 WGが定義<br />「EUC-JISX0213」 JIS X 0213:2000 付属書3<br />「EUC-JP-2004」 JIS X 0213:2004 付属書3<br />
  62. 62. 処理系の課題<br />内部エンコーディングを何にするか<br />様々なencodingの入力の扱い<br />地域・言語ごとに異なる規則<br />
  63. 63. 内部コードはどうするか<br />UCS正規化<br />内部では特定の1つに変換する<br />CSI (Code Set Independent)<br />それぞれの文字コードに対応する<br />
  64. 64. UCS正規化<br />Universal Character Set<br />Java, Perlなどほとんどが採用<br />内部コードを統一<br />入出力で変換が必要<br />入力はそのコードに変換<br />内部コードで処理<br />出力時に再び変換<br />
  65. 65. CSI方式<br />それぞれのencodingに対応<br />入出力を変換しない<br />入力そのまま取り込む<br />そのまま処理<br />そのまま出力<br />
  66. 66. Java<br />開発時期: 1990~1995<br />内部コード: UTF-16 (サロゲートペアは1.5から)<br />文字型: char (コードポイントは int)<br />文字列型: java.lang.String<br />グリフ列: CharSequence, BreakIterator等<br />「Javaにおける Unicode補助文字のサポート」<br />Windows NT も同時期<br />
  67. 67. .NET Framework<br />2000年リリース<br />内部コード: UTF-16<br />文字型: Char構造体<br />(コードポイントは Int32)<br />文字列型: System.String<br />グリフ列: System.Globalization.StringInfo<br />http://msdn.microsoft.com/ja-jp/library/system.globalization.stringinfo.aspx<br />http://msdn.microsoft.com/ja-jp/library/system.globalization.cultureinfo.aspx<br />
  68. 68. Perl 5.6<br />2000年リリース<br />内部コード: UTF-8<br />文字型: なし<br />文字列型: バイト列 / 文字列 (utf8 フラグ)<br />Perlは「型」の概念が薄い<br />http://github.com/github/perl/blob/blead/utf8.c<br />
  69. 69. Python 1.6<br />2000年リリース<br />内部UTF-16<br />文字型: char (UTF-16 code unit; 16bit)<br />文字列型: String (UTF-16)<br />http://www.egenix.com/www2002/python/unicode-proposal.txt<br />
  70. 70. Ruby1.8<br />内部コード: ASCII/SJIS/EUC/UTF-8<br />文字型: Fixnum(8bit)<br />文字列型: String<br />$KCODEでプロセスの文字コードを指定<br />「文字」のサポートはほとんどない<br />
  71. 71. Ruby 1.9<br />2007年1.9.0リリース<br />2009年1.9.1リリース<br />内部コード: N/A (CSI)<br />文字: 1文字String<br />文字列型: String<br />グリフ列: なし<br />
  72. 72. Ruby 1.9の特徴<br />Stringが文字単位になった<br />バイト操作と文字操作を区別する必要<br />CSI方式<br />特定の内部エンコーディングがない<br />Stringそれぞれがencodingを持つ<br />正規表現エンジンの刷新<br />鬼車ベースに変更<br />
  73. 73. 文字志向なString<br />"あいう".length-> 3<br />"あいうえお"[0]-> "あ"<br />"あい".gsub(/あ/,"か")-> "かい"<br />"abc".tr("abc","あいう")-> "あいう"<br />
  74. 74. String#each_*<br />String#each_byte<br />String#each_codepoint<br />String#each_char<br />String#each_line<br />String#eachは削除された<br />
  75. 75. 1文字String<br />専用の文字型は無い<br />文字は1文字Stringで表す<br />?a -> "a"<br />"abc"[0] -> "a"<br />"abc"[0] == ?a は1.9でも成り立つ<br />
  76. 76. 「文字」型に必要なもの<br />コードポイント, Encoding, (言語)<br />Stringは両方持っている<br />Rubyは大クラス主義<br />Stringを使えばよい<br />
  77. 77. Ruby 1.9のRegexp<br />/(.)/ =~ "あ" -> 0<br />$1 -> "あ"<br />/w/ =~ "あ" -> nil<br />1.9.1-p376 以降、1.9.2<br />以下はUnicode系<br />/(p{Alphabetic})/ =~ "あ"<br />$1 -> "あ"<br />/(p{Ideographic})/ =~ "漢"<br />$1 -> "漢"<br />
  78. 78. 1.9のStringに必要なこと<br />適切にencodingが設定されていること<br />理由<br />Stringのencodingを見て処理するから<br />設定方法<br />Magic comment(リテラル)<br />IO のオプション (入出力)<br />String#force_encoding(強制指定)<br />
  79. 79. encodingが誤っている時<br />invalid multibyte char (US-ASCII)<br />Magic comment忘れ<br />Encoding::CompatibilityError<br />異なったencodingのStringを混ぜた時<br />文字列をバイナリ扱いのままにしている時<br />ArgumentError: invalid byte sequence<br />単純な指定ミス<br />壊れた入力<br />
  80. 80. Magic Comment<br />リテラルのエンコーディングを指定<br />String, Regexp<br />デフォルトはUS-ASCII<br />Magic CommentがないとソースにASCII以外を書くことはできない<br />#coding:utf-8<br />#!/usr/local/bin/ruby#coding:utf-8<br /># -*- coding: UTF-8 -*-<br />
  81. 81. ERB用 Magic Comment<br />ERBでもMagic Commentが必要<br /><%# coding: UTF-8 %><br />
  82. 82. IOとEncoding<br />入出力のencodingを指定する<br />外部リソースのencodingを指定<br />open("foo.txt","r:UTF-8")<br />未指定ならEncoding.default_external<br />
  83. 83. ネットワークからの入力<br />Socket, Net::HTTPなど<br />現在はバイナリAPI扱い<br />->文字列の場合は自分でEncodingを設定する必要<br />
  84. 84. Encodingの強制指定<br />String#force_encoding(enc)<br />任意のencodingの文字列をバイナリから作りたい時<br />str = "xE3x81x82"str.force_encoding("UTF-8")str #=> "あ"<br />外部から来たデータに設定する時<br />IOなら外部エンコーディングを設定するべき<br />socketやnet系のライブラリで必要<br />
  85. 85. $KCODE is obsolete<br />$KCODEは内部コード指定のため使われた<br />Ruby1.9ではシステム全体の内部コードは、<br />決定不可能なため、廃止。<br />$KCODEを参照しているスクリプトは注意<br />
  86. 86. 結局encodingとは<br />Stringにとっての「型」<br />型が違えばエラー<br />型同士で互換性があれば、自動変換されることも->ASCII互換でのasciionly<br />
  87. 87. Encodingの3分類<br />ASCII互換<br />ASCII非互換<br />ダミー<br />
  88. 88. ASCII互換<br />フルサポート<br />Rubyスクリプトのソースエンコーディングとして使用可能<br />UTF-8, Shift_JIS, EUC-JP, ...<br />
  89. 89. Major Encodings<br />US-ASCII<br />ASCII-8BIT<br />UTF-8<br />
  90. 90. 日本語用<br />Shift_JIS<br />EUC-JP<br />
  91. 91. Other Encodings<br />Big5, Big5-UAO, EUC-KR, EUC-TW, GBK,<br />ISO-8859-X, KOI8-R, KOI8-U, etc<br />
  92. 92. Windows機種依存<br />Windows-31J<br />CP51932<br />eucJP-ms<br />Windows-125X<br />
  93. 93. ASCII-8BIT<br />ASCII互換バイト列<br />バイナリだけどASCII互換<br />ASCII互換の恩恵を得るため<br />
  94. 94. ASCII Only<br />特別扱い<br />ASCII互換エンコーディング<br />内容が7bit<br />"abcde".ascii_only?->true<br />"abcde" + "あいうえお"<br />ASCII互換エンコーディングなら、両者のエンコーディングによらず成功<br />
  95. 95. ASCII非互換<br />限定サポート<br />ソースコードには使えない<br />UTF-{16,32}{BE,LE}<br />
  96. 96. UTF-16 & UTF-32<br />UTF-16BE, UTF-16LE<br />UTF-32BE, UTF-32LE<br />しかし、UTF-16 や UTF-32 には非対応<br />BOM対応が困難なため<br />
  97. 97. Dummy encoding<br />Ruby は名前を知っているだけ<br />「文字」のサポートはしない<br />for stateful encodings<br />Encoding#dummy?-> true<br />ISO-2022-JP, UTF-7<br />
  98. 98. Encoding<br />「エンコーディング」を司るクラス<br />CSIではエンコーディングが内部処理でも使われるから活躍<br />でも、たいていエンコーディング名を表す文字列でよい<br />
  99. 99. Encodingの取得<br />enc = Encoding.find(“UTF-8”)=> #<Encoding:UTF-8><br />Encoding.find(“external”)デフォルト外部エンコーディング<br />Encoding.find(“internal”)デフォルト内部エンコーディング<br />Encoding.find(“filesystem”)ファイルシステムエンコーディング<br />Encoding::UTF_8定数も定義されている<br />
  100. 100. Encodingの一覧<br />Encoding.listオブジェクトの配列<br />Encoding.aliases別名 => 本名 のHash<br />Encoding.namesEncoding.findの引数になるStringの配列<br />
  101. 101. Encodingの情報<br />enc.name=> “UTF-8”<br />enc.names=> ["UTF-8", "CP65001", "locale", "external", "filesystem"]<br />enc.dummy?ダミーエンコーディングかどうか<br />enc.ascii_compatible?ASCII互換かどうか<br />
  102. 102. エンコーディング変換<br />nkf<br />kconv<br />iconv<br />uconv<br />String#encode<br />Encoding::Converter<br />
  103. 103. nkf<br />Network Kanji Filter<br />歴史ある変換コマンド<br />使うなら --ic, --ocオプションを使う事<br />
  104. 104. kconv<br />nkfのラッパー<br />String#tosjisなどと簡単<br />歴史的経緯による意図しない挙動<br />勝手にMIMEデコード<br />いわゆる半角カナが全角に<br />もはやオススメしない<br />
  105. 105. iconv<br />POSIX由来のiconv(3)のラッパー<br />挙動が環境依存<br />glibc/GNU libiconv/Citrus/…<br />1.9ではあえて使う必要はないはず<br />
  106. 106. uconv<br />Unicode 変換用拡張モジュール<br />0.5.3から1.9.1に対応しているが、互換性確保用に止めるべきであろう<br />http://www.yoshidam.net/Ruby_ja.html<br />
  107. 107. String#encode<br />Ruby 1.9独自のtranscode<br />String#encode(to, from, opt)<br />たいていの用途はこれでいけるはず<br />
  108. 108. Encoding::Converter<br />transcodeのエンジン<br />変換を一時停止・再開したい時<br />常人は使わないはずだが、何かの間違いで必要になるかもしれない<br />
  109. 109. Don't forget…<br />不必要な変換は避ける<br />open()等の引数に指定<br />
  110. 110. Ruby M17N の難しさ<br />テストがしづらい<br />US-ASCII<br />ASCI-8BIT<br />UTF-8 (ASCII Compatible)<br />UTF-16 (ASCII Incompatible)<br />ISO-2022-JP (dummy encoding)<br />
  111. 111. SJISとWindows-31J<br />Windows環境<br />Magic commentなどでSJISを指定<br />Encoding::CompatibilityError<br />入力はWindows-31Jだから<br />->Windows-31J指定が正しい<br />あなたがSJISだと思っているのは、実はWindows-31Jです<br />
  112. 112. ASCII-8BIT<br />Ruby M17N未対応のライブラリを使った時<br />ネットワーク系やDB系など<br />明示的にエンコーディングを指定<br />String#force_encoding(enc)<br />
  113. 113. ASCII非互換の正規表現<br />ASCII非互換エンコーディングな正規表現はリテラルで書けない<br />UTF-16LEの正規表現リテラルは書けない<br />Regexp.newを使う<br />Regexp.new( "あ".encode("UTF-16LE"))<br />
  114. 114. Open problems<br />ケータイ絵文字<br />WindowsのUnicodeパス<br />結合文字<br />異体字セレクタ/IVS<br />Stringと言語<br />Stateful encoding<br />Unicode用ユーティリティ<br />
  115. 115. ケータイ絵文字<br />mrknさんや設楽さんたちが作業中<br />1.9.2に入るかも<br />
  116. 116. WindowsのUnicodeパス<br />一部対応その他非対応<br />方針としては、現在WindowsのA系APIを叩いているものを、W系APIを使うように変える<br />そこら中で踏むのでリソース不足<br />いじれる方が居たらパッチください<br />Win32-unicode-testブランチ<br />
  117. 117. 結合文字<br />「が」を「か」+「゛」で表す<br />複数のコードポイントを1文字扱いする必要<br />Stringの「文字」をこれにする変更が入った事はあるが巻き戻された [ruby-dev:36375]<br />「文字」の単位がUnicodeのバージョンに依存<br />エスケープなどに影響<br />JavaのBreakIteratorっぽいものが必要?<br />検討中<br />
  118. 118. 異体字セレクタ/IVS<br />Ideographic Variation Sequence<br />結合文字同様、複数のコードポイントを1文字扱いする必要<br />
  119. 119. Stringと言語<br />日本語と中国語を同時に扱いたい<br />日本語と中国語を1つのStringに入れたい<br />可能かは文字コードによります<br />UTF-8ではできません<br />Unicodeは言語を別に与えないといけない<br />Stringにencodingとlangを持たせる必要<br />現状ユースケース不足<br />
  120. 120. Stateful encoding<br />現状ダミーエンコーディング<br />改善予定無し<br />
  121. 121. Unicodeユーティリティ<br />文字幅<br />Unicode正規化<br />Unicode大文字小文字化<br />APIをどうするか<br />そもそもどこにいれるのか<br />
  122. 122. String#sort<br />デフォルトでは文字コード順<br />シフトJISや日本語EUCの系統と、Unicode系のエンコーディングで並び順が変わる<br />現状ではsortにblock引数を指定する<br />RubyにはCollationとかは添付されていない<br />自分で比較ルーチンを用意して渡す<br />
  123. 123. Feedbackを<br />よいAPIを設計するには、ユースケースの収集が大事なのでfeedbackが重要<br />失敗談等はruby-listへ<br />バグ・提案はruby-devへ<br />オレはようやくのぼりはじめたばかりだからなこの果てしなく遠いM17Nをよ…<br />未実装<br />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×