Golang Go语言中 确定一个 GBK 字符集的真实长度,除了先转成 UTF8 再通过 runeCountIoString 以外,还有啥可以不经过字符集转换的方法么?

Golang Go语言中 确定一个 GBK 字符集的真实长度,除了先转成 UTF8 再通过 runeCountIoString 以外,还有啥可以不经过字符集转换的方法么?
请教大家,golang 确定一个 GBK 字符集的真实长度,除了先转成 UTF8 再通过 runeCountIoString 以外,还有啥可以不经过字符集转换的方法么?
GBK 转 UTF8 总怕会有些生僻字转换不成功导致识别错误的情况发生…

5 回复

自己扫一遍应该也可以。

GBK 是变长编码,ASCII 部分的字符一个字节,其他字符两个字节。所以看到 00-7F 之间的 byte 就 i++ c++,看到 80-FF 就 i+=2 c++

参考: https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97%E5%86%85%E7%A0%81%E6%89%A9%E5%B1%95%E8%A7%84%E8%8C%83#%E7%BC%96%E7%A0%81%E6%96%B9%E5%BC%8F

更多关于Golang Go语言中 确定一个 GBK 字符集的真实长度,除了先转成 UTF8 再通过 runeCountIoString 以外,还有啥可以不经过字符集转换的方法么?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


GBK 不是定长的么,除以 2 不就好了(
另外怎么可能 GBK 转 UTF8 不成功,unicode 肯定包括 GBK 所有字符。

不好意思没看 1 楼的打脸了
听 1 楼的吧!

#1 当然,这么做你得先保证你的字节流一定是有效的 GBK 串,因为 GBK 并不完整覆盖双字节的所有情况。

在Go语言中处理GBK字符集并确定其真实长度,确实是一个比较特殊的需求,因为Go语言的内置字符串处理函数主要围绕UTF-8编码设计。不过,不经过字符集转换直接获取GBK字符长度的方法虽然不常见,但可以通过一些技巧来实现。

一种方法是直接解析GBK编码的字节流。GBK是一种变长编码,单字节表示ASCII字符,双字节表示其他字符。你可以通过遍历字节数组,根据GBK编码规则来判断每个字符的边界,从而计算长度。这种方法需要你对GBK编码的字节结构有较深入的了解,并且实现起来相对复杂。

另一种较为实用的方法是利用第三方库。例如,golang.org/x/text/encoding/simplifiedchinese中提供了GBK编码的解码器,你可以使用这个解码器来读取GBK编码的字节流,并逐字符解析,同时计数字符数量。这种方法虽然本质上还是进行了字符集转换,但转换过程是在内部完成的,你无需显式地将整个字符串转换为UTF-8。

需要注意的是,直接解析GBK字节流的方法可能存在错误解析的风险,特别是在处理复杂文本时。因此,如果可能的话,建议使用经过充分测试的第三方库来处理GBK编码。

总之,虽然不经过字符集转换直接获取GBK字符长度的方法在Go语言中并不常见,但你可以通过直接解析字节流或使用第三方库来实现这一需求。

回到顶部