我收到了一些近距离请求,说我不清楚我在问什么。对我来说,我非常清楚我在问什么,我可能会在这个问题上增加一些额外的想法,但我的问题非常直接。这是我的问题的目标/论点:
如何检测字符串是否是二进制安全的。
类似的功能:
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。这些只是我刚才有的一些想法,以防万一这样的库已经存在,但我不确定。
答案 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"))
}
IsPrint报告符文是否被Go定义为可打印。这样 字符包括字母,标记,数字,标点符号,符号和 ASCII空格字符,来自类别L,M,N,P,S和ASCII 空间特征。除了以外,这种分类与IsGraphic相同 唯一的间距字符是ASCII空格,U + 0020。