Upgrade to Pro — share decks privately, control downloads, hide ads and more …

文字ときどきRuby / Character and Ruby (NSEG)

とみたまさひろ
January 27, 2024
1.6k

文字ときどきRuby / Character and Ruby (NSEG)

とみたまさひろ

January 27, 2024
Tweet

More Decks by とみたまさひろ

Transcript

  1. 「髙」 > '髙'.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
  2. この文字数は? � � � � � � � � �

    � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 26
  3. 国旗は2文字 � � U+1F1EF U+1F1F5 � � + � �

    国コードを国旗用文字2文字で書くと国旗になる � � + � � = � � � � 27
  4. 3人家族は1文字 � � � � � � � � �

    � � � � � � � � � U+1F46A 「FAMILY」という絵文字 28
  5. 4人家族は7文字 � � � � � � � � �

    � � � � � � � � � � � � � U+1F468 � � � � � MAN U+200D ゼロ幅接合子 U+1F469 � � � � � � WOMAN U+200D ゼロ幅接合子 U+1F467 � � � � � � � � � GIRL U+200D ゼロ幅接合子 U+1F466 � � � � � BOY 29
  6. 人間の肌色と髪型 � � � � U+1F9D1(大人) � � � �

    + U+1F3FB(明るい肌色) � � � � + U+1F3FC(やや明るい肌色) U+200D U+1F9B0(赤毛) � � � � + U+1F3FE(やや濃い肌色) U+200D U+1F9B2(坊主頭) 32
  7. プログラム的に自然なのは コードポイントの数 でも人にはわかりにくい > '� �� � � � �

    � � � � � � � � � � � � �� � � � � � � � � � � � � � � � � � � � � �'.size 10 34
  8. Ruby で書記素を扱う String#grapheme_clusters > '� �� � � � �

    � � � � � � � � � � � � �� � � � � � � � � � � � � � � � � � � � � �'.size 10 > '� �� � � � � � � � � � � � � � � � � �� � � � � � � � � � � � � � � � � � � � � �'.grapheme_clusters ["� �", "� � � � � � � � � � � � � � � � � �", "� � � � � � � � � � � � � � � � � � � � � �"] > '� �� � � � � � � � � � � � � � � � � �� � � � � � � � � � � � � � � � � � � � � �'.grapheme_clusters.size 3 36
  9. Ruby で書記素を扱う 正規表現 \X > '� �� � � �

    � � � � � � � � � � � � � �� � � � � � � � � � � � � � � � � � � � � �'.scan(/./) ["� �", "� �", "� � � � � � � � � � � � � � � � � �", "� � � � �", "", "� � � � � �", "", "� � � � � � � � �", "", "� � � � �"] > '� �� � � � � � � � � � � � � � � � � �� � � � � � � � � � � � � � � � � � � � � �'.scan(/\X/) ["� �", "� � � � � � � � � � � � � � � � � �", "� � � � � � � � � � � � � � � � � � � � � �"] 37