2014-11-03 102 views
8

如何使用Go去除給定的UTF8編碼字符串中的所有變音符號?例如轉換字符串"žůžo" =>"zuzo"。有沒有標準的方法?使用Go去除變音符號

回答

15

您可以使用Text normalization in Go中描述的庫。

這裏的這些庫的應用程序:

// Example derived from: http://blog.golang.org/normalization 

package main 

import (
    "fmt" 
    "unicode" 

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

func isMn(r rune) bool { 
    return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks 
} 

func main() { 
    t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC) 
    result, _, _ := transform.String(t, "žůžo") 
    fmt.Println(result) 
} 
+0

這很棒 - 知道go.text有一些更好的工具來處理Unicode,但沒有看到像這樣的實際用法。看起來我錯過了博客中的一些實用的東西。 :P – twotwotwo 2014-11-04 06:36:42

+2

這隻適用於有unicode分解的字符。例如,字符Ł(帶筆劃的L)不會改變(所以「AŁA」將轉換爲「AŁA」),儘管直觀上它應該被轉換爲「L」(所以「AŁA」=>「ALA」)。 – 2016-07-21 07:49:26

0

要擴大現有的答案了一下:

比較不同字符的字符串互聯網標準規定被稱爲「PRECIS」(準備,執行以及應用程序協議中國際化字符串的比較),並記錄在RFC7564中。在golang.org/x/text/secure/precis也有一個Go執行。

沒有一個標準配置文件可以做你想做的事情,但是定義一個新的配置文件是相當直接的。你會希望將Unicode規範化表單D(「D」用於「分解」,這意味着重音將被拆分併成爲它們自己的組合字符),然後刪除任何組合字符作爲附加映射規則的一部分,然後重新組合與規範化規則。事情是這樣的:

package main 

import (
    "fmt" 
    "unicode" 

    "golang.org/x/text/secure/precis" 
    "golang.org/x/text/transform" 
    "golang.org/x/text/unicode/norm" 
) 

func main() { 
    loosecompare := precis.NewIdentifier(
     precis.AdditionalMapping(func() transform.Transformer { 
      return transform.Chain(norm.NFD, transform.RemoveFunc(func(r rune) bool { 
       return unicode.Is(unicode.Mn, r) 
      })) 
     }), 
     precis.Norm(norm.NFC), // This is the default; be explicit though. 
    ) 
    p, _ := loosecompare.String("žůžo") 
    fmt.Println(p, loosecompare.Compare("žůžo", "zuzo")) 
    // Prints "zuzo true" 
} 

這讓你後來擴大與更多的選擇你的比較(例如寬度映射,案例映射等)。

另外值得一提的是,除去口音幾乎從未真正你在比較像這樣的字符串時想做的事情,但是,不知道你的用例,我實際上不能對你的項目做出斷言。爲了防止精簡配置文件的擴散,儘可能使用現有配置文件之一。還請注意,沒有努力優化示例配置文件。