7
7

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.

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

Last updated at Posted at 2017-11-23

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コード内であることが保証できます。

7
7
2

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
7
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?