⽂字もじemoji⽂字もじemojiよもやま話よもやま話2020-11-04@ima1zumi1
View Slide
⾃⼰紹介 ✋⾃⼰紹介 ✋@ima1zumi ( ❄)FJORD BOOT CAMPで学習中2
ある⽇のこと ある⽇のこと FJORD BOOT CAMP質問・雑談タイムに参加⽂字コードの話になる「" ".charsを実⾏してみるとおもしろいですよ」3
" ".chars=> ["", " ", "", " ", "", " ", ""]4
なぜ.charsするとなぜ.charsすると⼀家離散するのか⼀家離散するのか5
どう調べようか? どう調べようか? ⽂字コードを調べる6
⽂字コードを⾒てみよう ⽂字コードを⾒てみよう 使うものString#unpackunpack("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}"でもOK9
⽂字コードから⽂字に変換 ⽂字コードから⽂字に変換 " ".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)ゼロ幅接合⼦["", " ", "", " ", "", " ", ""]の ""が ZWJ12
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
graphemegrapheme書記素クラスタUnicodeにおいて、⾃然な1⽂字を表す単位22
「⽂字」は⾃明な単位ではない「⽂字」は⾃明な単位ではない「1⽂字」として扱いたいのは なのか、なのか?厳密に「⾒た⽬の1⽂字」を扱いたいなら書記素を単位とする23
⾒た⽬の1⽂字と⾒た⽬の1⽂字と⽂字コードの1⽂字⽂字コードの1⽂字は違うことがあるは違うことがある24