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

文字数の話 〜Unicodeの楽しい話〜

文字数の話 〜Unicodeの楽しい話〜

プログラミングをする際に間違えがちな文字数のカウント方法について,Unicodeの仕組みを紐解きながら解説しています.

しゅん🌙

July 02, 2023
Tweet

More Decks by しゅん🌙

Other Decks in Programming

Transcript

  1. 自己紹介 … 名前: しゅん … Twitter: @shun_shobon / GitHub: @shun-shobo1

    … 学校: 長野高専 電子情報工学科 5– … 得意: Web Frontend / Web Frontend Ops / A11y なI … 研究: ホログラフィ・ヒューマンインタフェースなI … 趣味: PCゲーム・自作キーボー … 一言: コンピュータと人との関わり方を模索しています
  2. Code Pointの符号化方法 このCode Pointを相手に送る際には,特定の方式によってバイナリにすることで送信される. これにはいくつかの方式がある. ˜ UTF-32 … どのCode Pointも4Byteで表r

    ˜ UTF-16 ... 小さなCode Pointは2Byte,大きいのは4Bytƒ ˜ UTF-8 ... なるべく小さなByteになるように1〜4Byteで表す ※ものすごい雑な解説なので詳しくは調べてください
  3. 符号化の例② 試しに「𠮟(U+20B9F)」をそれぞれの形式で符号化すると... I UTF-32 … 0x00, 0x02, 0x0B, 0x9V I

    UTF-16 ... 0xD8, 0x42, 0xDF, 0x9V I UTF-8 ... 0xF0, 0xA0, 0xAE, 0x9F ※UTF-32・UTF-16はビッグエンディアンでの場合
  4. まとめ n Unicodeにおける文字一つ一つに割り当てられるユニークなIDを Code Point と言g n JSでは文字列の内部表現がUTF-16で統一されていh n .lengthはCode

    Point単位の処理ではないので,直感と異なる値を返す事があh n Code Point単位で得たい場合はIteratorを使g n Unicodeでは「1Code Point = 直感的な1文字」とは限らな6 n 異体字セレク™ n 結合文— n 絵文字の合— n et† n 直感的な1文字のことをUnicodeでは 書記素クラスタ と呼Æ n JSでは Intl.Segmenter() を使うと簡単に書記素クラスタ単位に分割できる