gpt4 book ai didi

go - 如何测试二进制字符串是否有效的UTF8?

转载 作者:行者123 更新时间:2023-12-01 21:16:07 25 4
gpt4 key购买 nike

https://github.com/google/codesearch/blob/master/index/write.go#L581

我看到了上面的内容,以测试两个字节是否可以出现在有效的UTF8字符串中。但是我不明白它是如何工作的。有人可以帮助我了解为什么此功能有效吗?谢谢。

最佳答案

有关编码的说明,请参见wikipedia。编码为:

num
bytes 1st byte 2nd byte 3rd byte 4 byte
1 0xxxxxxx
2 110xxxxx 10xxxxxx
3 1110xxxx 10xxxxxx 10xxxxxx
4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

为了使该代码更易于与Wikipedia文章进行比较,下面是将 < n重写为 <= n-1并将整数文字重写为二进制整数文字的代码。
func validUTF8(c1, c2 uint32) bool {
switch {
case c1 <= 0b01111111:
// 1-byte, must be followed by 1-byte or first of multi-byte
return c2 <= 0b01111111 || 0b11000000 <= c2 && c2 <= 0b11110111
case c1 <= 0b10111111:
// continuation byte, can be followed by nearly anything
return c2 <= 0b11110111
case c1 <= 0b11110111:
// first of multi-byte, must be followed by continuation byte
return 0b10000000 <= c2 && c2 <= 0b10111111
}
return false
}

第一种情况检查1字节编码(0xxxxxxx)之后的字节。

第二种情况检查连续字节(10xxxxxx)之后的字节。

第三种情况检查多字节编码(110xxxxx,1110xxxx,11110xxx)开头的字节。

该函数报告两个字节是否可以有效的UTF-8编码。有效字节对的序列不一定是有效的UTF-8编码。

关于go - 如何测试二进制字符串是否有效的UTF8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62355505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com