Pikeっていう言語があります。多分、言語オタを名乗る人なら「静的型付けなんだか動的型付けなんだかよく分からないあの言語ね」って感じで通じるんじゃないでしょうか。
13日の金曜日だし、変な言語でJSONでもデコードしよう、と思い立ってインストールしてみてちょっと使ってみたのですが、結構面白いです。
で、意外とやるじゃん、と思ったのが、こんなプログラム(構文強調がPikeに対応してるわけがないのでC言語にしてます)。
int main() {
string str = "こんにちは、世界";
write("%d\n", strlen(str));
return 0;
}
なにをやっているかは雰囲気で分かると思います。
このプログラムは何を出力するでしょうか? 常識的に考えたら8
になると思います。("こんにちは、世界"
は8文字なので)
しかし、このプログラムは予想に反して、
24
と出力することになります。(UTF-8で保存した場合)
これは、UTF-8だと日本語(CJKなら)が3byteでエンコーディングされるためです。
これを、期待される結果にするために、utf8_strlen
を使うことができます。
int main() {
string str = "こんにちは、世界";
write("%d\n", utf8_strlen(str));
return 0;
}
これで、きちんと8
と出力されるようになりました。
でも…。わざわざ毎回utf8_strlen
とか打ちこむのは面倒ですよね?
これじゃ微妙だな…、と思ってさらに調べてみたらこんなページを見つけました。
そこにはPikeのプロセッサーディレクティブの一覧が載っているのですが(C言語の#include
のようなもの)、#charset
というディレクティブがあることが分かりました。
ただ、ドキュメントがあきらかに足りていなくて挙動が謎だったので、次のようなコードを試してみました。
#charset utf-8
int main() {
string str = "こんにちは、世界";
write("%d\n", strlen(str));
return 0;
}
なんと! これできちんと"こんにちは、世界"
は8文字として認識されるようになります。
さらに、この#charset
ディレクティブにはShift_JISなども指定することができます。(まあ、Shift_JISを指定すると\
が円記号にマッピングされて残念なことになるんですけど…)
歴史ある言語だけあって意外と多言語対応してるよ、って話でした。