2025年4月16日から18日まで、愛媛県県民文化会館にてRubyKaigi 2025が開催されました。1日目は、ima1zumiさんことMari Imaizumiさんによる基調講演からスタートしました。タイトルは
今回の会場の特徴として、メインホールに毎日違う緞帳が掛けられていました。1日目は、青く輝く波の緞帳です
緞帳が上がると


文字コード愛好家のima1zumiさん
ima1zumiさんは、IRBやRelineのメンテナとして活躍しています。RubyのUnicode 15.

「文字コード愛好家」
文字コードは
RubyKaigi愛好家でもある
RubyKaigi Takeout 2021
また、RubyKaigiへの登壇にとどまらず、有志とともにCosenseのRubyKaigi関連情報をまとめ、RubyKaigi 2024 感想記事まとめ の作成、RubyKaigi登壇者一覧サイト
松山出身のRubyist、Rubyコミッター、そしてRubyKaigi愛好家として、オープニングキーノートを飾るにふさわしい存在です。
文字コードの歴史
キーノートではまず、
文字コードとは、コンピュータ上で文字を取り扱うために定義された、文字の集合とそれをビット列に変換する方法
では、なぜ
電気のない時代の情報伝達
電気もコンピューターもない時代、人々は旗や煙、太鼓といった物理的な手段で遠くまで情報を伝えていました。その代表例が
煙の有無や色で合図を送るシンプルな仕組みですが、天候に左右されるという弱点がありました。
18世紀には、望遠鏡を使った光学式通信
電気通信時代の幕開け
電気の実用化によって登場したのがモールス符号です。
モールス符号は、ドット.
)-
)
この

コンピューターと文字コードの誕生
コンピューターが登場すると、1963年にASCII
同じ文字でも文字コードが異なるとバイト列が大きく異なります
文字コードの混乱期
1960年代以降、コンピュータが世界中に普及していく中で、各国や産業界ごとに独自の文字コードが策定されました。国際化対応や互換性の確保という課題に対して、それぞれが独自に対応していたため、異なる環境間のデータの受け渡しに混乱を招くことも少なくなかったと言います。
UnicodeとUTF-8の登場
その混乱を解決するために生まれたのがUnicodeです。世界中の文字を体系的に扱うための標準的な規格として、1991年に策定されました。
Unicodeでは、
コードポイントを符号化する方法

ここまでの情報伝達の歴史を振り返ると、どの時代も
こうして様々な文字コードが誕生しましたが、各国の文字を適切に扱うには既存の文字コードでは限界があり、やがて世界的にUnicodeのような統一規格を作る流れへと進んでいきました。現在では、多くのシステムやアプリケーションがUnicodeを採用しています。
文字コードとの出会い
ima1zumiさんがプログラミングを始めたのは、2016年頃のこと。
Unicodeが主流の時代に、なぜ文字コードに強く興味を持つようになったのでしょうか?
Unicodeへの移行が進んだ一方で、依然として文字コード間の互換性の問題やUnicodeを正しく扱う難しさがあり、それらを扱う上で多くの課題と面白さがあることに気づいたと言います。現代においても文字コードの存在感は大きく、こうした体験を通じて文字コードに
メインフレーム環境でのEBCDIC
ima1zumiさんが最初に出会った文字コードはEBCDICでした。
初めての仕事でメインフレームを扱うことになり、技術スタックはCOBOL、アセンブラ、JCL、z/
EBCDICは8ビット長の文字コードで、256種類の文字を扱うことができますが、日本語のひらがな、カタカナ、常用漢字などの膨大な文字数を全て表現することは不可能でした。
そのため当時の開発現場では、コードコメントの多くが半角カタカナで記述されており、読みやすさを保つために半角スペースを入れるなどの工夫が欠かせませんでした。
さらに、漢字を扱うには エディタ上の

家族の絵文字を入力するとIRBがクラッシュ
数年後、フィヨルドブートキャンプでRubyやRailsを学んでいたima1zumiさん。顧問の五十嵐さん
不具合を報告したところ、Relineの作者である糸柳さん
クラッシュの原因は「カーソル位置の計算」
IRBに家族の絵文字

家族の絵文字は見た目は1文字ですが、実際には7つのコードポイントから構成されています。4人の顔の絵文字とその間をつなぐZero Width Joiner (ZWJ) と呼ばれる制御文字がその構成要素です。
家族の絵文字の入力時は、構成文字それぞれの文字幅を計算しており、カーソル位置が右に大きくズレていました。削除時は、コードポイント単位ではなく見た目の文字単位


このように見た目は同じ1文字でも、コードポイントの数が異なる場合があります。
書記素クラスタとは、見た目上は1文字でも複数のコードポイントからなる場合、それらをまとめて1文字として扱うための仕組みです。アクセント付きの文字や複合絵文字などを書記素クラスタとして扱うことで、見かけ通りの操作ができるようになります。
Ruby 3.0に修正内容がマージされる
ima1zumiさんは、入力時に
この経験を通じて、書記素クラスタの仕組みやUnicodeの奥深さに触れ、Emojiの挙動についても調べるようになったとima1zumiさんは語ります。単なる文字の符号化を超え、見た目通りの挙動をしない文字があることに面白さを感じ、文字コードの奥深さにさらに引き込まれていきます。
RubyにおけるUnicodeのアップグレード対応
ima1zumiさんは、RubyWorld Conference 2024のハッカソンにて、RubyにおけるUnicodeのバージョン対応が止まっていることに気づきます。ハッカソンがきっかけとなり、RubyのUnicodeのアップグレード対応を始めることにしました。
どのようにアップグレードするのか
Unicodeは年に一度のペースで新バージョンがリリースされます。Rubyがこれに追従することで、多言語や絵文字などを含む最新の文字セットを正しく扱えるようになります。
では、実際にどのようにしてRubyに取り込んでいくのでしょうか?
UnicodeではUnicode Character Database
RubyでUnicodeの新しいバージョンを取り込む際には、UCDをRuby内部にまとめて取り込みます。
具体的には、ビルドの設定でUnicodeのバージョン番号を更新した後、enc-unicode.

【Unicode 15.1.0】 Indic_Conjunct_Breakを扱えるようにする
実際のUnicode 15.
Unicode 15.

Indic_
【Unicode 15.1.0】テストの失敗とOnigmoへの対応
無事、UCDの取り込みは成功したものの、次にぶつかったのはGraphemeBreakTest.
ima1zumiさんは
UnicodeにはGrapheme Break Rulesというルールが定義されており、制御文字や合字、絵文字などにおいて、どこで分割できるか、あるいはできないかを細かく定めています。

たとえば、家族の絵文字のような合成絵文字に関してはGB11ルールが適用され、分割されないようになっています。Unicode 15.

ima1zumiさんは、Onigmoの実装について
実際のプルリクエストはこちらです。
コミッターになったima1zumiさん自身でこのプルリクエストをマージしたそうで、
【Unicode 16.0.0】取り込むにあたっての課題
ima1zumiさんは、Unicodeの最新バージョンである16.
Unicodeの正規化にはNFC、NFD、NFKC、NFKDという4つの形式があり、文字列の比較や検索で統一的に扱うために用いられます。
たとえば、éという文字は1文字としても表せますし、eとアキュート記号
現状のテスト失敗の原因として、次のことに触れていました。
- 正規化の際に一度合成したあとにさらに合成が必要になるようなケースで、1回の合成処理しか行われていない可能性がある
- ハッシュによるマッチ処理の誤りの可能性がある
ima1zumiさんは、
なお、ima1zumiさんからの後日談として
Ask the Speaker Share Your Thoughts
最後にima1zumiさんは、同じくスピーカーであるKanekoさんの発言を引用しながら、
筆者もスピーカーに質問したり、感想を伝えることで新しい発見があったり、技術的な関心が増していくのを実感しています。積極的にスピーカーに声をかけていこうと思えた一幕でした。
深掘りの楽しさを伝える
発表の締めくくりでは、
ima1zumiさんの人柄があふれる、素晴らしいオープニングキーノートでした。