如何在go(golang)中使函数检测字符串是否是二进制安全的?

时间:2014-07-10 05:29:48

标签: string go

我收到了一些近距离请求,说我不清楚我在问什么。对我来说,我非常清楚我在问什么,我可能会在这个问题上增加一些额外的想法,但我的问题非常直接。这是我的问题的目标/论点:

如何检测字符串是否是二进制安全的。

类似的功能:

IsBinarySafe(str) //returns true if its safe and false if its not.

如果有不清楚的地方,请询问澄清评论。我总是花很多时间和时间来提出好问题,所以我尽可能多地努力解决问题并帮助我做得更好,这样每个人都可以获得与我一样多的好处。

此后的任何评论都是我想到或试图解决的问题:


我认为必须存在一个已经做到这一点但却很难找到它的库。如果没有,你如何实现呢?

我在想一些解决方案,但并不确定它们是好的解决方案。 其中之一是遍历字节,并具有所有非法字节序列的哈希映射。 我还想过用正常的非法字符串写一个正则表达式,但不确定这是不是很好的解决方案。 我也不确定来自其他语言的字节序列是否算作二进制安全。比如典型的golang示例:

世界

将:

IsBinarySafe(世界) //true or false?

它会返回真还是假?我假设所有二进制安全字符串应该只使用1个字节。所以在following way

中迭代它
const nihongo = "日本語abc日本語"
    for i, w := 0, 0; i < len(nihongo); i += w {
        runeValue, width := utf8.DecodeRuneInString(nihongo[i:])
        fmt.Printf("%#U starts at byte position %d\n", runeValue, i)
        w = width
    }

并且每当宽度大于1时返回false。这些只是我刚才有的一些想法,以防万一这样的库已经存在,但我不确定。

1 个答案:

答案 0 :(得分:3)

二进制安全性与字符的宽度无关,主要是或多或少地检查不可打印的字符,如空字节等。

来自Wikipedia

  

二进制安全是一种主要用于连接的计算机编程术语   使用字符串操作函数。二进制安全功能是   基本上是一个将其输入视为原始数据流而没有   任何特定的格式。因此它应该适用于所有256个可能的值   一个角色可以采取(假设8位字符)。

我不确定你的目标是什么,现在几乎所有语言都处理utf8 / 16,但是对于你的具体问题,这是一个相当简单的解决方案:

// checks if s is ascii and printable, aka doesn't include tab, backspace, etc.
func IsAsciiPrintable(s string) bool {
    for _, r := range s {
        if r > unicode.MaxASCII || !unicode.IsPrint(r) {
            return false
        }
    }
    return true
}

func main() {
    fmt.Printf("len([]rune(s)) = %d, len([]byte(s)) = %d\n", len([]rune(s)), len([]byte(s)))

    fmt.Println(IsAsciiPrintable(s), IsAsciiPrintable("test"))
}

playground

来自unicode.IsPrint

  

IsPrint报告符文是否被Go定义为可打印。这样   字符包括字母,标记,数字,标点符号,符号和   ASCII空格字符,来自类别L,M,N,P,S和ASCII   空间特征。除了以外,这种分类与IsGraphic相同   唯一的间距字符是ASCII空格,U + 0020。