utf8everywhere.orgを読んで

UTF-8 Everywhere
インターネットにおいてはそりゃあそうだろうと思いつつ読んでみたら、WindowsにおけるC++プログラミングの話でなかなか興味深かった。
要約すると、

  1. UTF-16は固定長ではない
  2. UTF-8を使ってもパフォーマンスコストは無い

というところか。
重要なのは、UTF-16を使っても固定長にはならない、という点だが、完璧ではないからダメ、というのはあまり意味が無い。
危険なのは、UTF-16で完璧だと思い込むことだろうと思う。大抵の場合で問題が無いからこそ、わかりにくいバグの元になる。
自分のスタイルは、何も考えずただ_UNICODEUNICODEをdefineして、リテラルは_Tを使って、変数にはstd::wstringを、ファイルにはboost::filesystem::fstreamを、文字列は固定長として扱い、Windowsのサポートも中途半端なサロゲートペア等は非サポート、というもの。
日本語のファイル名だとかを使う程度のことにはこれで問題無い。日本語に関しては、Shift_jisが問題ありすぎるだけで、あんまりUNICODEとは関係無い気もする。
他言語においては、やはり自分が使ってないと分からない*1、というのが全てのように思う。UTF-8にすれば解決する、という問題でも無く、固定長の文字列エンコーディングなど無い、という前提でプログラミングするしか無い。
そして、固定長で無いならUTF-16/32を使う意義は無く、UTF-8にすべきだろう、という話になるわけだが、自分としては、すでに確立してる慣習的なものから移行するには、単純な新旧比較ではなく、新しいものに移行コストを無視できるかなりの優位性が求められ、UTF-8にそこまでのそれは感じない。

*1:Giraffe+にnaı̈veをコピペすると、見事に扱えてない