检查字符串仅包含ASCII字符

时间:2018-10-30 16:38:15

标签: go ascii

Go有什么方法或建议如何检查字符串是否仅包含ASCII字符吗?正确的方法是什么?

根据我的研究,解决方案之一是检查是否有大于127的字符。

func isASCII(s string) bool {
    for _, c := range s {
        if c > unicode.MaxASCII {
            return false
        }
    }

    return true
}

3 个答案:

答案 0 :(得分:2)

看来您的方法最好。

ASCII的简单定义为:

  

ASCII将128个指定字符编码为7位整数

因此,字符的值为0-2 7 (或0-127,0x0-0x7F)。

Go无法检查字符串(或片中的字节)中的每个符文是否都具有特定范围内的数值,因此您的代码似乎是最好的方法。

答案 1 :(得分:2)

在Go中,我们关心性能,因此,我们将对您的代码进行基准测试:

func isASCII(s string) bool {
    for _, c := range s {
        if c > unicode.MaxASCII {
            return false
        }
    }
    return true
}

BenchmarkRange-4    20000000    82.0 ns/op

更快(更好,更惯用)的版本,避免了不必要的符文转换:

func isASCII(s string) bool {
    for i := 0; i < len(s); i++ {
        if s[i] > unicode.MaxASCII {
            return false
        }
    }
    return true
}

BenchmarkIndex-4    30000000    55.4 ns/op

ascii_test.go

package main

import (
    "testing"
    "unicode"
)

func isASCIIRange(s string) bool {
    for _, c := range s {
        if c > unicode.MaxASCII {
            return false
        }
    }
    return true
}

func BenchmarkRange(b *testing.B) {
    str := ascii()
    b.ResetTimer()
    for N := 0; N < b.N; N++ {
        is := isASCIIRange(str)
        if !is {
            b.Fatal("notASCII")
        }
    }
}

func isASCIIIndex(s string) bool {
    for i := 0; i < len(s); i++ {
        if s[i] > unicode.MaxASCII {
            return false
        }
    }
    return true
}

func BenchmarkIndex(b *testing.B) {
    str := ascii()
    b.ResetTimer()
    for N := 0; N < b.N; N++ {
        is := isASCIIIndex(str)
        if !is {
            b.Log("notASCII")
        }
    }
}

func ascii() string {
    byt := make([]byte, unicode.MaxASCII+1)
    for i := range byt {
        byt[i] = byte(i)
    }
    return string(byt)
}

输出:

$ go test ascii_test.go -bench=.
BenchmarkRange-4    20000000    82.0 ns/op
BenchmarkIndex-4    30000000    55.4 ns/op
$

答案 2 :(得分:0)

另一种选择:

package main
import "golang.org/x/exp/utf8string"

func main() {
   {
      b := utf8string.NewString("south north").IsASCII()
      println(b) // true
   }
   {
      b := utf8string.NewString("?????").IsASCII()
      println(b) // false
   }
}

https://pkg.go.dev/golang.org/x/exp/utf8string#String.IsASCII