未读取golang unicode/norm迭代器的最后一个符文
我使用未读取golang unicode/norm迭代器的最后一个符文,unicode,go,normalization,unicode-normalization,Unicode,Go,Normalization,Unicode Normalization,我使用golang.org/x/text/unicode/norm包在[]字节中迭代符文。我选择这种方法是因为我需要检查每个符文,并维护有关符文序列的信息。最后一次调用iter.Next()不会读取最后一个符文。在最后一个符文上读取0字节 代码如下: package main import ( "fmt" "unicode/utf8" "golang.org/x/text/unicode/norm" ) func main() { var ( n int
golang.org/x/text/unicode/norm
包在[]字节中迭代符文。我选择这种方法是因为我需要检查每个符文,并维护有关符文序列的信息。最后一次调用iter.Next()
不会读取最后一个符文。在最后一个符文上读取0字节
代码如下:
package main
import (
"fmt"
"unicode/utf8"
"golang.org/x/text/unicode/norm"
)
func main() {
var (
n int
r rune
it norm.Iter
out []byte
)
in := []byte(`test`)
fmt.Printf("%s\n", in)
fmt.Println(in)
it.Init(norm.NFD, in)
for !it.Done() {
ruf := it.Next()
r, n = utf8.DecodeRune(ruf)
fmt.Printf("bytes read: %d. val: %q\n", n, r)
buf := make([]byte, utf8.RuneLen(r))
utf8.EncodeRune(buf, r)
out = norm.NFC.Append(out, buf...)
}
fmt.Printf("%s\n", out)
fmt.Println(out)
}
这将产生以下输出:
test
[116 101 115 116]
bytes read: 1. val: 't'
bytes read: 1. val: 'e'
bytes read: 1. val: 's'
bytes read: 0. val: '�'
tes�
[116 101 115 239 191 189]
这可能是
golang.org/x/text/unicode/norm
及其Init()函数中的错误
在包的测试和示例中,我看到所有这些都使用InitString。因此,作为一种解决方法,如果您更改:
it.Init(norm.NFD, in)
致:
事情会按预期进行的
我建议打开一个bug报告,但要注意,因为它位于“/x”目录中,所以go开发人员认为该包是实验性的
(顺便说一句,我使用了帮助我跟踪正在发生的事情,但我应该说它的使用远远不是我希望看到的那种调试器。)
it.InitString(norm.NFD, `test`)