Go? Kullanarak belirtilen UTF8 kodlanmış dizesindeki tüm aksanları nasıl silebilirim? Örneğin. "žůžo"
dizgisini dönüştürün =>"zuzo"
. Standart bir yol var mı?Git'ü kullanarak diacritics'i kaldırın Git
cevap
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)
}
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.
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
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"). –