gpt4 book ai didi

go - 如何从 Go 中的字节缓冲区中删除 Unicode 字符?

转载 作者:IT王子 更新时间:2023-10-29 01:41:54 24 4
gpt4 key购买 nike

我有一个 bytes.Buffer 类型的变量,我用 Unicode 字符填充了它:

var mbuff bytes.Buffer
unicodeSource := 'کیا حال ھے؟'
for i,r := range(unicodeSource) {
mbuff.WriteRune(r)
}

注意:我在这里迭代了一个 Unicode 文字,但实际上源是用户输入字符的无限循环。

现在,我想从缓冲区 mbuff 中的任何位置删除一个 Unicode 字符。问题是字符的字节大小可能是可变的。所以我不能只从 mbuff.String() 中挑选出第 ith<​​/em> 个字节,因为它可能是字符的开头、中间或结尾。这是我的微不足道(而且可怕)的解决方案:

// removing Unicode character at position n
var tempString string
currChar := 0
for _, ch := range(mbuff.String()) { // iterate over Unicode chars
if currChar != n { // skip concatenating nth char
tempString += ch
}
currChar++
}
mbuff.Reset() // empty buffer
mbuff.WriteString(tempString) // write new string

这在很多方面都很糟糕。首先,我将缓冲区转换为字符串,删除 元素,然后将新字符串写回缓冲区。操作太多。其次,我在循环中使用 += 运算符将 Unicode 字符连接成一个新字符串。我首先使用缓冲区正是为了避免使用 += 进行连接,这比 this answer points out 慢.

什么是删除 bytes.Buffer 中第 ith<​​/em> 个 Unicode 字符的有效方法?
还有什么是在 i-1 Unicode 字符之后(即在 位置)插入 Unicode 字符的有效方法?

最佳答案

要从字节 slice 中删除第 个 rune ,循环遍历 slice 计数 rune 。当找到第 i 个 rune 时,将 rune 后面的字节复制到第 个 rune 的位置:

func removeAtBytes(p []byte, i int) []byte {
j := 0
k := 0
for k < len(p) {
_, n := utf8.DecodeRune(p[k:])
if i == j {
p = p[:k+copy(p[k:], p[k+n:])]
}
j++
k += n
}
return p
}

此函数修改参数 slice 的支持数组,但不分配内存。

使用此函数从 bytes.Buffer 中删除 rune 。

p := removeAtBytes(mbuf.Bytes(), i)
mbuf.Truncate(len(p)) // backing bytes were updated, adjust length

playground example

要从字符串中删除第 个 rune ,循环遍历字符串计数 rune 。当找到第 i 个 rune 时,通过将 rune 之前的字符串段与 rune 之后的字符串段连接来创建一个字符串。

func removeAt(s string, i int) string {
j := 0 // count of runes
k := 0 // index in string of current rune
for k < len(s) {
_, n := utf8.DecodeRuneInString(s[k:])
if i == j {
return s[:k] + s[k+n:]
}
j++
k += n
}
return s
}

此函数分配一个字符串,即结果。 DecodeRuneInString是标准库unicode/utf8包中的一个函数。

关于go - 如何从 Go 中的字节缓冲区中删除 Unicode 字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39907667/

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