トップ 最新 追記
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2012年06月05日

SHIFT-JIS使用禁止な話

最近facebookやtwitterに書き込んでいるのでこちらのblogは放置状態でした。久々に書くネタを見つけたので更新します。
基本的な話ですが最近似た話があったので書き残しておくことにします。
次のようなC言語プログラムがあったとします。
#include <stdio.h>
 
int main(){
	int x=0;
	int table[]={0,10,20,30,40,50,60,70,80,90,100}; // 点数表
	x=2;
	printf("TENSU=%d\n",table[x]);
}
これ実行すると TENSU= いくつになります? 20ですか?実際にやってみましょう。
$ gcc tensu.c
$ ./a.out
TENSU=0
TENSU=0 になります。そんな馬鹿な??

実はこれソースコードをSHIFT-JISで保存した場合に発生する不具合です。SHIFT-JISでの「表」の漢字コードは 0x95 0x5C です。この 0x5C が ASCIIの \ になるため、
  // 点数表
  x=2;
  // \
  x=2;
と解釈され、コメントの次の行の x=2 もコメントの一部になってしまいます。コンパイラはエラーを出しません。バグの発見は困難でしょう。
SHIFT-JISで漢字コードの2バイト目が \ 記号(エスケープ記号)になる文字は次の通りです。
— ソ Ы Ⅸ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 
兔 喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 偆 砡 
覚えきれませんよね。

Windows等の shift-jis系での開発では、古来から『日本語の後ろには必ずスペースを入れろ』と強く言われてきたはずです。\ + SPACEなら問題は起きません。またUNIX系での開発ではEUCまたはUTF-8を使う事で回避しています。

まとめ
・shift-jisで開発するときは漢字の後ろにスペースを入れる
・UNIX系ではEUC最近ならUTF-8を使う。shift-jisはガラケー向けのCGI等、特別な理由がない限り避ける