Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
文字ときどきRuby / Character and Ruby
Search
とみたまさひろ
December 09, 2023
Technology
1.5k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
文字ときどきRuby / Character and Ruby
とみたまさひろ
December 09, 2023
More Decks by とみたまさひろ
See All by とみたまさひろ
MySQLとPostgreSQLのコレーション / Collation of MySQL and PostgreSQL
tmtms
1
1.9k
文字列の並び順 / Unicode Collation
tmtms
4
1.4k
夢の印税生活 / Life on Royalties
tmtms
0
700
文字列の並び順 / String Collation
tmtms
1
300
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
1.2k
Ruby on Browser - RubyWorld Conference 2024
tmtms
1
1.7k
Ruby on Browser
tmtms
1
2.5k
私のRSpecの書き方 / How I write RSpec
tmtms
5
2.4k
ショートカットと端末 / shortcut & terminal
tmtms
2
1.1k
Other Decks in Technology
See All in Technology
Gifu WordPress Meetup #200 に向けて、私たちには何ができるだろうか?/ 2026-11-07 Gifu WordPress Meetup
torounit
0
150
AWS構成から考えるWebセキュリティ ― WordPressの構築経験から考える公開範囲と更新運用【JAWS FESTA 2026 in AKITA】
cscengineer
PRO
1
200
In-Context Learning再入門。ICLの勾配降下的解釈の研究動向を追ってみる。
dai08srhg
1
300
推論基盤と Scale-Up Interconnect の現状と制約から俯瞰する技術動向
markunet
2
810
攻撃 3 時間 vs 復旧 10 時間。アクセスキー流出の非対称性を体感するために CTF を作った話
kazzpapa3
1
140
DBTS2026 盛り上がってますか!?Databricksが実現するAI時代のデータ基盤
akuwano
1
130
AX時代の自治体支援リソース再配分と役割分担の再構成:戦略とロードマップ(概要)
sishi2026
0
200
生成AI時代のIAMのマニアックな話
takuros
6
2k
【dbts2026】AIエージェントの 判断と探索を変える、 データベース エンジニアリング― 既存DBの処理と依存関係から作る、オペレーショナルオントロジー ―
shisyu_gaku
0
160
サボる子はいねぇがー!AgentCoreハーネスの脆弱性に学ぶ、エージェントの入力バリデーション
iwamot
PRO
4
240
増え続けるプロダクトの品質をどう担保するか。ProductSpecとTypeScriptによる取り組み
joere
3
390
`go get`したらELFが降ってきた件
taiyow
0
170
Featured
See All Featured
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
400
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
33
5.6k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
121
120k
It's Worth the Effort
3n
188
29k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
810
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
Done Done
chrislema
187
17k
Transcript
文字ときどきRuby nagano.rb #13 2023-12-09 とみたまさひろ 1
自己紹介 • とみたまさひろ • • https://twitter.com/tmtms https://blog.tmtms.net 2
これは同じ文字? 直 直 3
フォントが違うだけで同じ文字 直 U+76F4 日本語フォント 直 U+76F4 中国語フォント 4
これの違いと同じ 直 直 5
コンピュータで扱う文字は文字ごとに番号(コードポイント) が振られていてプログラムから見たときは同じコードポイ ントであれば同じ文字 6
Rubyでコードポイントを知る > '直'.ord.to_s(16) "76f4" > 'ほげ'.chars.map{_1.ord.to_s(16)} ["307b", "3052"] > 'ほげ'.unpack('U*').map{_1.to_s(16)}
["307b", "3052"] 7
これは同じ文字? 令 令 8
違う文字 令 U+4EE4 CJK統合漢字 令 U+F9A8 CJK互換漢字 9
正規化すれば同じ文字 String#unicode_normalize > '令'=='令' false > '令'=='令'.unicode_normalize true 10
正規化でこんなことも 使いようによっては便利 '0'.unicode_normalize(:nfkc) => '0' '①'.unicode_normalize(:nfkc) => '1' 'ア'.unicode_normalize(:nfkc) =>
'ア' 'パ'.unicode_normalize(:nfkc) => 'パ' '㌖'.unicode_normalize(:nfkc) => 'キロメートル' 11
これは同じ文字? 令 � 12
異体字 令 U+4EE4 � U+4EE4 U+E0102 13
基底文字に異体字セレクタを追加することで プレーンテキストでも文字の見た目を 指定することができる 14
異体字セレクタ � U+4EE4 U+E0102 ←これ U+E0100〜U+E01EF が異体字セレクタ 対応システムと対応フォントが必要 15
異体字セレクタ 異体字セレクタセレクタが便利 https://747.github.io/vsselector/#!/ja/908a 16
異体字セレクタ unicode_normalize では消えないので U+E0100〜U+E01EF を消す "\u4ee4\u{e0102}".gsub(/[\u{e0100}-\u{e01ef}]/, '') 17
「髙」と「﨑」 > '高' == '髙' false > '崎' == '﨑'
false 18
「髙」 Unicode では「髙」は「高」の異体字ではなく別の文字 別の文字なので異体字セレクタにもない SJIS(Windows-31J)でも別の文字 でも JIS では「髙」という文字は存在しない 「高」の異体字扱い 19
「髙」 > '髙'.encode('Windows-31J') "\x{FBFC}" > '髙'.encode('SJIS') # SJIS は Windows-31J
の別名 "\x{FBFC}" > '髙'.encode('Shift_JIS') # Shift_JIS と SJIS は異なる # `encode': U+9AD9 from UTF-8 to Shift_JIS # (Encoding::UndefinedConversionError) 20
「髙」 Unicode 上は別の文字なので同一文字として扱わなけれ ばいいんだけど、人名検索とかだと同一文字として扱いた いこともあるかもしれないのでむずかしい 21
「﨑」 CJK互換漢字 「令」と同じ だけど unicode_normalize では「崎」にならない > '﨑'.unicode_normalize "﨑" #
CJK互換漢字は普通は正規化できる > '福'.unicode_normalize "福" 22
「﨑」 これも「髙」と同じく変換するには個別対応が必要そう U+FA11(﨑)はU+5D0E(崎)に統 合漢字ブロックの異体字を持つが、字体 差が大きいとみなされ統合の範疇とされ ていない。 CJK互換漢字 - Wikipedia 23
これは同じ文字? へ ヘ 24
別の文字だけど日本語のバグ へ 平仮名 ヘ 片仮名 25
この文字数は? 26
国旗は2文字 U+1F1EF U+1F1F5 + 国コードを国旗用文字2文字で書くと国旗になる + = 27
3人家族は1文字 U+1F46A 「FAMILY」という絵文字 28
4人家族は7文字 U+1F468 MAN U+200D ゼロ幅接合子 U+1F469 WOMAN U+200D ゼロ幅接合子 U+1F467
GIRL U+200D ゼロ幅接合子 U+1F466 BOY 29
濁点つき文字 ぱ U+3071 ぱ U+306F U+309A 「は」+合成用半濁点文字 (これは unicode_normalize(:nfc) で1文字の「ぱ」になる)
30
囲み文字 a⃝ U+0041 U+20DD a⃤ U+0041 U+20E4 a⃞ U+0041 U+20DE
a ⃣ U+0041 U+20E3 31
人間の肌色と髪型 U+1F9D1(大人) + U+1F3FB(明るい肌色) + U+1F3FC(やや明るい肌色) U+200D U+1F9B0(赤毛) + U+1F3FE(やや濃い肌色)
U+200D U+1F9B2(坊主頭) 32
文字数とは? 33
プログラム的に自然なのは コードポイントの数 でも人にはわかりにくい > ' '.size 10 34
書記素 より 「人が1文字として見える文字」みたいな 書記素(しょきそ、英: grapheme)と は、書記言語において意味上の区別を 可能にする最小の図形単位をいう 書記素 - Wikipedia
35
Ruby で書記素を扱う String#grapheme_clusters > ' '.size 10 > ' '.grapheme_clusters
[" ", " ", " "] > ' '.grapheme_clusters.size 3 36
Ruby で書記素を扱う 正規表現 \X > ' '.scan(/./) [" ", "
", " ", " ", "", " ", "", " ", "", " "] > ' '.scan(/\X/) [" ", " ", " "] 37
まとめ • ユニコードはカオス • 文字列を比較するときは正規化 • 文字数はコードポイントなのか書記素なのかを考える 38