SJISテキストを使うメリットとは

Linuxを触っていると何気なくUTF8を当然のように使っていますが、日本語でWindowsを使うときはSJISが一般的です。 何故UTF8なのでしょうか。一般的なSJISではダメなのでしょうか。 両者を比べてみましょう。

~$ echo -n あいうえお > utf8
~$ echo -n あいうえお | nkf -s > sjis
~$ ls -l utf8 sjis
-rw-r--r-- 1 takk takk 10  6月  5 11:59 sjis
-rw-r--r-- 1 takk takk 15  6月  5 11:59 utf8
~$ 

全角の5文字のテキストですが、SJISなら10Byte、UTF8は15Byte、SJISの方がサイズが小さくなり分があります。

それぞれを圧縮したらどうなるでしょうか。まずは実験するための五十音テキストを作成。

~$ ruby -e 'puts ("あ".."ん").to_a' | pr -t10J | expand -t1
あ か ご ぜ つ ぬ ぴ ぼ や れ
ぃ が さ そ づ ね ふ ぽ ゅ ろ
い き ざ ぞ て の ぶ ま ゆ ゎ
ぅ ぎ し た で は ぷ み ょ わ
う く じ だ と ば へ む よ ゐ
ぇ ぐ す ち ど ぱ べ め ら ゑ
え け ず ぢ な ひ ぺ も り を
ぉ げ せ っ に び ほ ゃ る ん
お こ
~$ 

上記のコマンドで作成した五十音テキストをUTF8としてutf8.txtに保存、そして、SJISとしてsjis.txtに保存します。

~$ !!>utf8.txt
ruby -e 'puts ("あ".."ん").to_a' | pr -t10J | expand -t1>utf8.txt
~$ nkf -s < utf8.txt > sjis.txt
~$ nkf --guess *.txt
sjis.txt: Shift_JIS (LF)
utf8.txt: UTF-8 (LF)
~$ 

非圧縮前のサイズを確認します。当然SJISの方が小さいです。

~$ ls -l *.txt
-rw-r--r-- 1 takk takk 246  6月  5 14:39 sjis.txt
-rw-r--r-- 1 takk takk 328  6月  5 14:38 utf8.txt
~$ 

では圧縮してみます。bzip2にします。

~$ bzip2 {sjis,utf8}.txt
~$ ls -l *.bz2
-rw-r--r-- 1 takk takk 164  6月  5 14:39 sjis.txt.bz2
-rw-r--r-- 1 takk takk 163  6月  5 14:38 utf8.txt.bz2
~$ 

あれれ、UTF8のファイルの方が短くなっています。
五十音の並びでたまたまそうなったのでしょうか。再度シャッフルしたファイルでbzip2圧縮してみます。

~$ ruby -e 'puts ("あ".."ん").to_a' | shuf | pr -t10J | expand -t1
ぜ ぐ ん ぼ な ぞ ふ う て じ
ぴ べ ご さ び ひ そ や ぅ ぷ
の ゃ わ は ょ ほ あ ゐ み ぉ
か ゅ と ま ゆ た に こ ぇ ぶ
ね つ を い る す が ば ゑ く
ず ぽ っ ど ら り へ ぱ ろ ぺ
ぢ で し ざ ぃ き め む ぬ よ
づ せ け げ ゎ ぎ お ち も れ
だ え
~$ ruby -e 'puts ("あ".."ん").to_a' | shuf | pr -t10J | expand -t1 > utf8.txt
~$ nkf -s < utf8.txt > sjis.txt
~$ bzip2 {utf8,sjis}.txt
~$ ls -l *.bz2
-rw-r--r-- 1 takk takk 168  6月  5 14:53 sjis.txt.bz2
-rw-r--r-- 1 takk takk 177  6月  5 14:53 utf8.txt.bz2
~$ 

11ByteほどSJISの方が小さくなりました。SJISの方が元ファイルのサイズが小さいですので、より小さくなるはずなのですが、差が小さくてよくわかりません。小説を使って比較したいと思います。
青空文庫から、太宰治の人間失格を使います。

~$ wget http://www.aozora.gr.jp/cards/000035/files/301_ruby_5915.zip
~$ ls -l
合計 68
-rw-r--r-- 1 takk takk 68596  1月 10  2011 301_ruby_5915.zip
~$

元々のファイルがzipなので、zipどうしで比較してみましょう。

~$ mv ningen_shikkaku.txt old.txt
~$ nkf -w < !$ > !^
nkf -w < old.txt > ningen_shikkaku.txt
~$ sed -n 40p < ningen_shikkaku.txt
 自分は子供の頃から病弱で、よく寝込みましたが、寝ながら、敷布、枕のカヴァ、掛蒲
団のカヴァを、つくづく、つまらない装飾だと思い、それが案外に実用品だった事を、二
十歳ちかくになってわかって、人間のつましさに暗然とし、悲しい思いをしました。
takk@deb83:~/sjis$ 

~$ zip utf8.zip ningen_shikkaku.txt 
  adding: ningen_shikkaku.txt (deflated 66%)
~$ ls -l
合計 520
-rw-r--r-- 1 takk takk  68596  1月 10  2011 301_ruby_5915.zip
-rw-r--r-- 1 takk takk 229000  6月  5 16:22 ningen_shikkaku.txt
-rw-r--r-- 1 takk takk 153317  1月  9  2011 old.txt
-rw-r--r-- 1 takk takk  77344  6月  5 16:29 utf8.zip
~$ 

元ファイルはSJISテキストのzip圧縮で68595Byte、UTF8に変換したテキストは77344BYte、やはりSJISファイルの方が小さくなりました。元ファイル自体が小さいので、当然ですね。
bzip2圧縮で確認してみましょう。不要ファイルは削除して最初から。

~$ unzip 301_ruby_5915.zip      
~$ ls
301_ruby_5915.zip  ningen_shikkaku.txt
~$ nkf -w ningen_shikkaku.txt > utf8.txt
~$ mv ningen_shikkaku.txt sjis.txt
~ ls -l
合計 444
-rw-r--r-- 1 takk takk  68596  1月 10  2011 301_ruby_5915.zip
-rw-r--r-- 1 takk takk 153317  1月  9  2011 sjis.txt
-rw-r--r-- 1 takk takk 229000  6月  5 17:13 utf8.txt
~$ bzip2 *.txt
~$ ls -l
合計 180
-rw-r--r-- 1 takk takk 68596  1月 10  2011 301_ruby_5915.zip
-rw-r--r-- 1 takk takk 55280  1月  9  2011 sjis.txt.bz2
-rw-r--r-- 1 takk takk 56476  6月  5 17:13 utf8.txt.bz2
~$      

サイズ差が小さくなりましたが、SJISの方が小さいことに変わりはありません。

コメント

タイトルとURLをコピーしました