Edited at

Go言語で文字列がASCIIコード内であるか判定したい

More than 1 year has passed since last update.

ASCIIコード内であることを保証したいとします。大体の場合は正規表現で [0-9a-zA-Z]+ みたいな感じにすればASCIIコード内の普通の文字っぽいな、みたいなのが保証できるのでそうやるのがよいと思います。

しかしGo言語の正規表現は非常に遅いことで知られています。特にユーザーのリクエストで叩かれるロジックならば使うべきではないでしょう。

真面目にやるならfor文で1バイトずつ見ていけば、ASCIIコード内であることが分かります。ただ実は標準パッケージでそれとほぼ同様のことをやっているパッケージがあります。

utf8としてvalidなバイト列を判定する方法をGoから見る - Qiita

このことが分かっていれば、以下のようにできることが分かります。

str := "あいうえお"

utf8.ValidString(str) && utf8.RuneCountInString(str) == len(str) // false

最初にutf8.ValidStringを呼んでいるのは、utf8.RuneCountInStringがutf8として不正なバイト列を渡した場合、不正なバイト列に出会ったタイミングで処理を打ち切り、そこまでの文字数を返すような実装になっているからです。事前に確認する方が安全です。

utf8の特徴として『utf8としてValidであり、utf8としての文字数とバイト数が同じならばASCIIコードである』と言えるので、これでASCIIコード内であることが保証できます。