前記事では生成AIにまとめてもらった文字コードに関わるあれこれなのですが、
本記事では個人的に思った(思いついた)ことについて書いていきたいなと思います。
ある種のメモ書きのようなものなので”おち”やあとがきはありません。
個人的な活用法の覚書
UTF-○○の部分は○○ビット区切りの扱いであることを覚えておくべし
Unicode関連のUTF-8,UTF-16,UTF-32についてなのですが、
- UTF-8が1バイト(8ビット)区切りの可変長最大4バイト
-> つまり文字によって1バイト、2バイトだったり、3バイト、4バイトだったりする。(通常の半角英数などが1バイト、ひらがな・漢字などで3バイトのものがある) - UTF-16が2バイト(16ビット)区切りの可変長最大4バイト
-> つまり2バイトか4バイトかのどちらかになるということ。UTF-8との違いとしては英数字なども2バイトとなる。多くの日本語文字も2バイト内に収まるが一部漢字は4バイトになる? - UTF-32が4バイトの固定長
-> つまりどんな文字であろうとも基本的に4文字に統一される。
例外としては複合絵文字(複数の絵文字で一つの絵文字が作られるものなど)などは文字を作るために必要な文字数に応じたバイト数になる?
なので使いたい場所によって使い分けが必要です。
Unicodeのそれぞれの使い分けについて
Unicodeのサイズについて前述したのですが、正直どう使いこなせばいいかわかんないですよね・・・。そんなわけで簡易的に使いどころをまとめておきます。
- UTF-8
保存した際のサイズが一番小さくなるはずなので、特に理由が無ければ使うスタンダード。 - UTF-16
基本的な文字がほぼ2バイト固定なため、文字列全体の大きさが把握しやすいのか、WindowsなどのOSの内部処理で使われることが多い。(widestring的なところ) - UTF-32
絵文字は微妙なところだが、基本的な文字は全て4バイトに固定されるため、局所的な例にはなるがゲームなどで文字をウィンドウに表記する際に、
– 元の文章情報はUTF-8で保存
– 表示する前段階でUTF-8->UTF-32に変換
– 4バイト固定なのでstd::u32stringなどの配列に入れて一文字づつ回すことが可能になる
といったところの使用方法が考えられる。
この方式の利点としては比較的リソースファイルのサイズを抑えることが出来るという点です。小規模な開発ではあまり効果はないかもしれませんが、大規模なゲームやノベルゲーム系は恩恵を受けやすいかなと思います。
Shift_JIS(SJIS)の利点について
前記事や前述したUnicodeの内容を見て、「ならばShift_JIS(Unicode外)の存在意義・活用場所はどこにあるんだろう」と考えると思うのですが、Unicodeとの比較でShift_JISを使う意義を見ていきたいと思います。
日本語中心のテキストではUTF-8よりもファイルサイズが小さくなる。
Shift_JISは英数・記号・半角カタカナなどの半角文字が1バイト、通常の日本語表記のひらがな・カタカナ・漢字などが2バイトの表記であらわされる可変長文字コード 。
-> つまり最大で一文字あたり2バイト。例として全角”A”は2バイト、半角”A”は1バイト
そのため漢字などが一文字あたり3バイト(文字によっては4バイト)ほどになってしまうUnicodeよりもファイルサイズが小さくなる傾向にあります。
日本語環境のレガシーシステムやプログラム資産を使うときに必要になるかも?
会社所属などで古くに書かれたコードなどを参照しようとしたときに文字列入力や使用する文字列引数の値として想定されていることが多いかも?
いずれにせよ、現代の新規プロジェクトで全体をShift_JISエンコードする必要はなく、一部でUnicode文字列などを変換して使用する仕様でいい気がしますね・・・。
