Go 如何检测/处理多种unicode方式对字母上的重音进行编码

Go 如何检测/处理多种unicode方式对字母上的重音进行编码,go,unicode,diacritics,Go,Unicode,Diacritics,信不信由你,这个词的iota(最后一个字母)似乎以unicode的两种不同方式编码: εἰμί(带TONOS'U+03AF的希腊文小写字母IOTA) εἰμί(带OXIA'U+1F77的希腊文小写字母IOTA) 我假设有时该字母被编码为单个字母,而有时它被编码为字母+重音 是否有某种映射或数据库允许我们在一个或另一个映射或数据库之间进行转换,我可以将其导入到我的代码中 信不信由你 让我们离开幻想的世界吧 比如说, package main import ( "bytes"

信不信由你,这个词的iota(最后一个字母)似乎以unicode的两种不同方式编码:

  • εἰμί(带TONOS'U+03AF的希腊文小写字母IOTA)
  • εἰμί(带OXIA'U+1F77的希腊文小写字母IOTA)
我假设有时该字母被编码为单个字母,而有时它被编码为字母+重音

是否有某种映射或数据库允许我们在一个或另一个映射或数据库之间进行转换,我可以将其导入到我的代码中

信不信由你

让我们离开幻想的世界吧


比如说,

package main

import (
    "bytes"
    "fmt"

    "golang.org/x/text/unicode/norm"
)

func Equal(a, b string) bool {
    var ia, ib norm.Iter
    ia.InitString(norm.NFKD, a)
    ib.InitString(norm.NFKD, b)
    for !ia.Done() && !ib.Done() {
        if !bytes.Equal(ia.Next(), ib.Next()) {
            return false
        }
    }
    return ia.Done() && ib.Done()
}

func main() {
    a := "εἰμ\u03AF"
    b := "εἰμ\u1F77"
    fmt.Println(a)
    fmt.Println(b)
    fmt.Println(a == b)
    fmt.Println(Equal(a, b))
}
输出:

εἰμί
εἰμί
false
true

我不喜欢unicodes,但这似乎是您想要的: