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
170
文字もじemojiよもやま話 / moji-moji-emoji
ima1zumi
November 05, 2020
Tweet
Share
More Decks by ima1zumi
See All by ima1zumi
10年物のRailsアプリにキャッチアップ!〜コードを読まずに理解したかった〜
ima1zumi
0
5
RubyKaigiの登壇者一覧ページを作った
ima1zumi
0
4
Relineのその後の生活
ima1zumi
0
130
IRB and Reline Kaigi 2024
ima1zumi
0
4
Exploring Reline: Enhancing Command Line Usability
ima1zumi
3
13k
Reline 1分 Cooking
ima1zumi
0
20
続・mruby/cにUTF-8 を実装する
ima1zumi
1
17
UTF-8 is coming to mruby/c
ima1zumi
4
5k
たのしいString
ima1zumi
1
520
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
46
4.9k
Docker and Python
trallard
40
3k
Documentation Writing (for coders)
carmenintech
65
4.4k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
26
4.1k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Music & Morning Musume
bryan
46
6.1k
Happy Clients
brianwarren
97
6.7k
It's Worth the Effort
3n
183
27k
Facilitating Awesome Meetings
lara
49
6k
Building Applications with DynamoDB
mza
90
6k
Ruby is Unlike a Banana
tanoku
96
11k
The Pragmatic Product Professional
lauravandoore
31
6.2k
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