【问题标题】:How to detect/handle multiple unicode ways to encode an accent over a letter如何检测/处理多种 unicode 方式来对字母上的重音进行编码
【发布时间】:2018-08-19 03:48:29
【问题描述】:

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

  • εἰμί(希腊小写字母 IOTA 与 TONOS' U+03AF)
  • εἰμί(希腊小写字母 IOTA 与 OXIA' U+1F77)

我假设有时字母被编码为单个字母,而其他时候它被编码为字母+重音。

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

【问题讨论】:

标签: go unicode diacritics


【解决方案1】:

信不信由你

让我们离开幻想的世界。

Duplicated vowel+oxia characters in Greek Unicode range

The Unicode Consortium

Unicode: Frequently Asked Questions: Normalization

The Go Blog: Text normalization in Go


例如,

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

【讨论】:

    猜你喜欢
    • 2020-11-25
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多