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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
とみたまさひろ
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.3k
夢の印税生活 / Life on Royalties
tmtms
0
680
文字列の並び順 / String Collation
tmtms
1
270
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
1.2k
Ruby on Browser - RubyWorld Conference 2024
tmtms
1
1.7k
Ruby on Browser
tmtms
1
2.4k
私のRSpecの書き方 / How I write RSpec
tmtms
5
2.4k
ショートカットと端末 / shortcut & terminal
tmtms
2
1.1k
Other Decks in Technology
See All in Technology
データ品質を壊しながらSnowflakeのAIに分析させてみた
kawanago
0
360
3人で1000GPU超を統合運用する?マルチクラウド&オンプレを跨ぐ、構築と運用のリアル!
kazukun0716
2
800
Lambda MicroVMsが分からなすぎたので使い所を1から考えてみた
tsukuboshi
2
280
IR Today: Theory, Practice, and Agents
dtunkelang
0
310
ログラスのマルチプロダクトを 支える認証基盤 〜テナントごとに異なる統制とどう向き合うか〜
dada4386
3
310
1人アドミンな私はAWSアカウント申請をSlackで完結したい!
ysuzuki
0
110
インバスケット試験対策アプリを 作って見えたAIエージェント構築 ナレッジ2選
shichijoyuhi
0
100
営業オントロジーの作り方と、エージェントからの辿り方 ── ナレッジワークの現場から
kworkdev
PRO
1
220
プラットフォームを「作る」、 チームに「入り込む」
sansantech
PRO
0
420
Account Factory for Terraformによる 標準化されたアカウント発行の自動化
pensuke628
0
120
AIは爆速なのに、私が詰まっていた話 ― 音声入力と鳴くマスコットでボトルネックを削る
yama3133
0
220
『GOエコノミー 』(相乗りサービス) におけるスペック駆動開発
mot_techtalk
1
140
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
6.3k
The Cult of Friendly URLs
andyhume
79
7k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
720
We Have a Design System, Now What?
morganepeng
55
8.3k
sira's awesome portfolio website redesign presentation
elsirapls
0
430
Ruling the World: When Life Gets Gamed
codingconduct
0
380
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
400
Optimising Largest Contentful Paint
csswizardry
37
4k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
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