golang unicode/nome迭代器的最后一个符文没有被读取



我正在使用golang.org/x/text/unicode/norm包来迭代[]byte中的符文。我选择这种方法是因为我需要检查每个符文并维护有关符文序列的信息。对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("%sn", 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: %qn", n, r)
    buf := make([]byte, utf8.RuneLen(r))
    utf8.EncodeRune(buf, r)
    out = norm.NFC.Append(out, buf...)
  }
  fmt.Printf("%sn", 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)

至:

 it.InitString(norm.NFD, `test`)

事情会按预期进行的。

我建议打开一个bug报告,但要注意,由于它位于"/x"目录中,所以go开发人员认为该包是实验性的。

(顺便说一句,我使用了我的the-go调试器来帮助我跟踪正在发生的事情,但我应该说,它的使用是我希望看到的那种调试器。(

最新更新