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の方が小さいことに変わりはありません。
コメント