2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pikeって意外とやるじゃん、って思った

Posted at

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を指定すると\が円記号にマッピングされて残念なことになるんですけど…)

歴史ある言語だけあって意外と多言語対応してるよ、って話でした。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?