Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
7
Help us understand the problem. What is going on with this article?
@catatsuy

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

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

7
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
catatsuy
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
7
Help us understand the problem. What is going on with this article?