
本文介绍在 go 中将字符串逐字符转换为对应 unicode 码点的二进制字符串(无前缀、无分隔符)的实现方法,并说明位宽处理、unicode 支持边界及实际使用注意事项。
本文介绍在 go 中将字符串逐字符转换为对应 unicode 码点的二进制字符串(无前缀、无分隔符)的实现方法,并说明位宽处理、unicode 支持边界及实际使用注意事项。
在 Go 中,字符串本质上是 UTF-8 编码的字节序列,但 range 遍历字符串时会自动按 Unicode 码点(rune) 解码。因此,将字符串转为二进制表示,应以 rune 为单位,将其整数值格式化为二进制字符串。
最简洁可靠的实现如下:
package main
import "fmt"
func stringToBin(s string) string {
var binString string
for _, r := range s {
binString += fmt.Sprintf("%b", r)
}
return binString
}
func main() {
fmt.Println(stringToBin("CC")) // 输出: 10000111000011
}该函数对 "CC" 的处理过程为:
- 'C' 的 Unicode 码点是 67,二进制为 1000011
- 第二个 'C' 同样为 1000011
- 拼接后得到 10000111000011,与示例完全一致。
⚠️ 注意事项:
-
不补零,按需截取:%b 格式符输出的是最简二进制形式(无前导零),例如 65 → "1000001",而非 "01000001"。若需固定位宽(如每字符 8 位),可改用 %.8b:
fmt.Sprintf("%.8b", r) // 对 'C'(67) 输出 "01000011"但请注意:此方式仅适用于码点 ≤ 255(即 ASCII 范围);对于希腊字母 Φ(U+03A6 = 934)、数学符号 ≠(U+2260 = 8800)等超出 8 位的字符,%.8b 仍会输出完整位数(如 934 → "1110100110",共 10 位),不会截断或错误——Go 的 fmt 自动适配所需位宽。
非字节级转换:本方法操作的是 rune(码点),而非原始 UTF-8 字节。例如 "α"(U+03B1)→ 1110110001(937 的二进制),而非其 UTF-8 编码 0xCE 0xB1 的拼接 1100111010110001。如需字节级二进制,请先转 []byte(s) 再遍历。
-
性能提示:频繁字符串拼接(+=)在大数据量下效率较低。生产环境建议使用 strings.Builder:
func stringToBinOptimized(s string) string { var b strings.Builder for _, r := range s { fmt.Fprintf(&b, "%b", r) } return b.String() }
总结:stringToBin 是轻量、语义清晰的解决方案,适用于教学、协议标识、简单编码场景;但需明确其基于 Unicode 码点而非字节,且不强制位宽。实际工程中,应根据目标协议(如是否要求定长编码、是否需区分 UTF-8 字节 vs 码点)选择合适策略。

















