【发布时间】:2021-12-17 20:28:33
【问题描述】:
在 golang (go1.17 windows/amd64) 中,下面的程序给出以下结果:
rune1 = U+0130 'İ'
rune2 = U+0131 'ı'
lower(rune1) = U+0069 'i'
upper(rune2) = U+0049 'I'
strings.EqualFold(İ, ı) = false
strings.EqualFold(i, I) = true
我认为strings.EqualFold 会在 Unicode 大小写折叠下检查字符串是否相等;然而,上面的例子似乎给出了一个反例。显然,两个符文都可以(手动)折叠成大小写相同的代码点。
问题:strings.EqualFold(İ, ı) 是 false 的 golang 是否正确?我预计它会产生true。如果 golang 是正确的,为什么会这样呢?或者这种行为是否符合某些 Unicode 规范。
我在这里错过了什么。
程序:
func TestRune2(t *testing.T) {
r1 := rune(0x0130) // U+0130 'İ'
r2 := rune(0x0131) // U+0131 'ı'
r1u := unicode.ToLower(r1)
r2u := unicode.ToUpper(r2)
t.Logf("\nrune1 = %#U\nrune2 = %#U\nlower(rune1) = %#U\nupper(rune2) = %#U\nstrings.EqualFold(%s, %s) = %v\nstrings.EqualFold(%s, %s) = %v",
r1, r2, r1u, r2u, string(r1), string(r2), strings.EqualFold(string(r1), string(r2)), string(r1u), string(r2u), strings.EqualFold(string(r1u), string(r2u)))
}
【问题讨论】:
标签: go unicode case-insensitive