Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
文字もじemojiよもやま話 / moji-moji-emoji
Search
ima1zumi
November 05, 2020
0
200
文字もじemojiよもやま話 / moji-moji-emoji
ima1zumi
November 05, 2020
Tweet
Share
More Decks by ima1zumi
See All by ima1zumi
Ruby Taught Me About Under the Hood
ima1zumi
6
16k
Exploring Reline: Enhancing Command Line Usability
ima1zumi
1
96
10年物のRailsアプリにキャッチアップ!〜コードを読まずに理解したかった〜
ima1zumi
0
100
RubyKaigiの登壇者一覧ページを作った
ima1zumi
0
440
Relineのその後の生活
ima1zumi
0
240
IRB and Reline Kaigi 2024
ima1zumi
0
17
Exploring Reline: Enhancing Command Line Usability
ima1zumi
3
15k
Reline 1分 Cooking
ima1zumi
0
39
続・mruby/cにUTF-8 を実装する
ima1zumi
1
34
Featured
See All Featured
A Tale of Four Properties
chriscoyier
160
23k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
How to Ace a Technical Interview
jacobian
279
23k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
34
6k
The Cost Of JavaScript in 2023
addyosmani
53
8.9k
GraphQLとの向き合い方2022年版
quramy
49
14k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Faster Mobile Websites
deanohume
309
31k
Context Engineering - Making Every Token Count
addyosmani
2
41
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
Transcript
⽂字もじ emoji ⽂字もじ emoji よもやま話 よもやま話 2020-11-04 @ima1zumi 1
⾃⼰紹介 ✋ ⾃⼰紹介 ✋ @ima1zumi ( ❄) FJORD BOOT CAMP
で学習中 2
ある⽇のこと ある⽇のこと FJORD BOOT CAMP 質問・雑談タイムに参加 ⽂字コードの話になる 「" ".chars を実⾏してみるとおもしろいです
よ」 3
" ".chars => [" ", " ", " ", "
", " ", " ", " "] 4
なぜ .chars すると なぜ .chars すると ⼀家離散するのか ⼀家離散するのか 5
どう調べようか? どう調べようか? ⽂字コードを調べる 6
⽂字コードを⾒てみよう ⽂字コードを⾒てみよう 使うもの String#unpack unpack("U*") でUTF-8 のコードポイントに変換 String#to_s(16) 16 進数に変換
7
["1F468", "200D", "1F469", "200D", "1F466", "200D", "1F466"] " ".unpack("U*").map{_1.to_s(16).upcase} =>
["3042"] " ".unpack("U*").map{_1.to_s(16).upcase} => ["1F468", "200D", "1F469", "200D", "1F466", "200D", "1F466"] 8
1つ1つ⾒てみよう 1つ1つ⾒てみよう ⽂字コードから⽂字になおしたい Array#pack を使う コードポイントの前に0x をつける "\u{1F468}" でもOK 9
⽂字コードから⽂字に変換 ⽂字コードから⽂字に変換 " ".unpack("U*").map{"U+#{_1.to_s(16).upcase}"} => ["U+1F468", "U+200D", "U+1F469", "U+200D", "U+1F466",
"U+200D", "U+1F466"] [0x1F468].pack("U*") => " " [0x200D].pack("U*") => " " [0x1F469].pack("U*") => " " [0x1F466].pack("U*") => " " 10
わかったこと わかったこと " " は [" ", " ", "
", " ", " ", " ", " "] でできてい た なぜこうなる? 11
字 字 ⽂字と⽂字を組み合わせて作られる⽂字 組み合わせるために特殊な⽂字が使われる 家族の絵⽂字の場合は Zero width Joiner(ZWJ) ゼロ幅接合⼦ ["
", " ", " ", " ", " ", " ", " "] の "" が ZWJ 12
ZWJ を使った絵⽂字の例 ZWJ を使った絵⽂字の例 13
特殊な絵⽂字たち 特殊な絵⽂字たち 国旗 ⽂字と絵⽂字 ❤ ❤ 肌⾊ 特殊なのでわりと壊れがち 14
chars で⼀家離散した理由 chars で⼀家離散した理由 A. そもそも別々の⽂字だから 15
ところで ところで " " は何⽂字ですか? 16
7 ⽂字? " ".length => 7 " ".chars => ["
", " ", " ", " ", " ", " ", " "] 17
質問2 質問2 " が" は何⽂字ですか? 18
結合⽂字の " が" 2 ⽂字? " ".length => 2 "
".chars => [" ", ゙ "] 19
⾒た⽬1⽂字だから ⾒た⽬1⽂字だから 1⽂字で扱いたい 1⽂字で扱いたい 20
⼀家離散を防ぐ⽅法 ⼀家離散を防ぐ⽅法 A. String#grapheme_clusters を使う " ".grapheme_clusters => [" "]
21
grapheme grapheme 書記素クラスタ Unicode において、⾃然な1⽂字を表す単位 22
「⽂字」は⾃明な単位ではない 「⽂字」は⾃明な単位ではない 「1⽂字」として扱いたいのは なのか、な のか? 厳密に「⾒た⽬の1⽂字」を扱いたいなら書記 素を単位とする 23
⾒た⽬の1⽂字と ⾒た⽬の1⽂字と ⽂字コードの1⽂字 ⽂字コードの1⽂字 は違うことがある は違うことがある 24