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
150
文字もじemojiよもやま話 / moji-moji-emoji
ima1zumi
November 05, 2020
Tweet
Share
More Decks by ima1zumi
See All by ima1zumi
Reline 1分 Cooking
ima1zumi
0
1
続・mruby/cにUTF-8 を実装する
ima1zumi
0
1
UTF-8 is coming to mruby/c
ima1zumi
3
4.2k
たのしいString
ima1zumi
1
430
Watchから始めるOSS生活
ima1zumi
0
43
String meets Encoding
ima1zumi
2
2.4k
Emojiの正規表現
ima1zumi
0
1
RubyKaigiで話した話
ima1zumi
1
340
漢字が文字コードになる前の話
ima1zumi
0
1
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
397
65k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
352
28k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
19
1.9k
Designing with Data
zakiwarfel
94
4.8k
Become a Pro
speakerdeck
PRO
8
4.4k
jQuery: Nuts, Bolts and Bling
dougneiner
57
7.1k
Facilitating Awesome Meetings
lara
39
5.5k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
5
1.4k
Six Lessons from altMBA
skipperchong
19
2.9k
For a Future-Friendly Web
brad_frost
170
8.9k
In The Pink: A Labor of Love
frogandcode
137
21k
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