2014-11-03 22 views

cevap

15

Text normalization in Go'da açıklanan kitaplıkları kullanabilirsiniz.

farklı karakterin dizeleri karşılaştırmak için internet standardı "PRECIS" denir kümelerini

(Hazırlık, İcra:

// 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

Bu harika - go.text'in Unicode'u eğitmek için bazı meraklı araçlarının olduğunu ancak bunun gibi pratik bir kullanım görmediğinin farkındaydı. Blog’dan bazı pratik şeyleri kaçırmışım gibi görünüyor. : P – twotwotwo

+2

Bu, yalnızca bir unicode ayrışması olan karakterler için çalışır. Örneğin, karakter Ł (inme ile L) değiştirilmeyecektir (bu nedenle "AŁA" "AŁA" ye dönüştürülecektir), sezgisel olarak "L" ye çevrilmelidir (böylece "AŁA" => "ALA"). –

0

mevcut Yanıta biraz genişletmek için: Burada

bu kütüphanelerin bir uygulama var ve Uygulama Protokollerinde Uluslararası Dizelerin Karşılaştırılması) ve RFC7564 sayılı belgede belgelenmiştir. Ayrıca golang.org/x/text/secure/precis adresinde bir Go uygulaması da vardır.

Standart profillerin hiçbiri istediğinizi yapmaz, ancak yeni bir profil tanımlamak oldukça doğru olur. Unicode Normalizasyon Formu D'yi ("Ayrıştırma" için "D", yani vurguların ayrılacağı ve kendi birleştirme karakterleri olduğu) uygulamak ve sonra ek eşleme kuralının parçası olarak herhangi bir birleştirme karakterini kaldırmak ve sonra yeniden oluşturmak istiyorsunuz. normalleşme kuralı ile. Böyle bir şey:

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" 
} 

Bu daha sonra daha fazla seçenekleri ile karşılaştırma genişletmek sağlar (örneğin genişlik haritalama, vaka haritalama, vb.) Bu aksan çıkarmadan ne aslında neredeyse hiç olduğunu belirterek, aynı zamanda değer

bunun gibi dizeleri karşılaştırırken yapmak istiyorum, ancak, kullanım durumunuzu bilmeden, aslında projeniz hakkında bu iddiayı yapamıyorum. Precis profillerin çoğalmasını önlemek için mümkün olan yerlerde mevcut profillerden birini kullanmak iyidir. Ayrıca, örnek profili optimize etmek için çaba sarf edilmediğini de unutmayın.

İlgili konular