標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

nyagos の type, more で UTF16 をサポート

(qrunch.io より転記)

これな

当初は「とりあえず書いてみた」という感じの issue で、そのうちニーズがない割に面倒なので、やめようかな…と思っていました。

が、最近、会社で過去に書いたプロダクトに問題があって、その修正をしていのたですが、ワークファイルが UTF16 で保存されていて、vim ではかろうじて開けるものの、more も grep も使えないので、たいへんなことに。

ということでですね、実は別途 ANSI/UTF8 の自動判別読み込みフィルター "github.com/zetamatta/go-texts/mbcs".NewAutoDetectReader別パッケージで作ってまして、それを改善する形で取り込んで、UTF16 もサポートするようにしました。 (※バイナリ版はまだリリースしていません)

これの文字コード判別ルールは極めて簡単で

  • \xFF\xFE で始まっていたら、UTF16LE 確定
  • \xFE\xFF で始まっていたら、UTF16BE 確定
  • 0スタートの偶数バイト目に \0 が存在していたら、UTF16BE 確定
  • 奇数バイト名に \0 が存在していたら、UTF16LE 確定
  • 任意の場所に \xEF\xBB\xBF があれば UTF8 確定
  • 1行単位で読み込んで、Go 言語の "utf8".Valid() が false ならば、非UTF8 のマルチバイト文字列と確定
  • 以上でなければ、暫定的に UTF8 とする

実のところ、こんな判別ルールよりももっとたいへんなのが、 "golang.org/x/text/transform" のルールに準拠したテキストフィルターの書き方だったのですが、それはまた別の機会にでも