在go语言中规范化unicode字符串用于比较的目的代码示例

2023-06-01 00:00:00 示例 字符串 目的

下面是一个关于如何规范化unicode字符串和对unicode字符串进行适当比较的教程。


单一码字符串的规范化在确保你的程序能正确处理用户输入方面起着重要作用。

它在对传入的数据进行理智检查时也很有用,以确保在执行进一步的字符串操作之前,底层表示法是匹配的。

不同的表示法会导致你的程序产生不准确的字符串比较结果。


在这个例子中,比较两个非标准化的unicode字符串将导致错误的匹配。

不是因为它们的长度不同,而是因为字符串的基本表示法不匹配。

用transform.Chain()函数对unicode字符串进行规范化处理,

将创建具有匹配的基础表示的新字符串。


示例代码:

 package main
 
 import (
         "fmt"
         "golang.org/x/text/transform"
         "golang.org/x/text/unicode/norm"
         "strings"
         "unicode"
 )
 
 func isMn(r rune) bool {
     return unicode.Is(unicode.Mn, r) // Mn: 非间距标记
 }
 
 func main() {
         str1 := "ElNi\u00f1o"
         str2 := "ElNin\u0303o"
         
         fmt.Printf("%s 的长度是 %d \n", str1, len(str1))
         fmt.Printf("%s 的长度是 %d \n", str2, len(str2))
         match := strings.EqualFold(str1, str2)
         fmt.Println(match)
         
         fmt.Println("规范化的unicode字符串....")
         
         t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)
         normStr1, _, _ := transform.String(t, str1)
         fmt.Printf("%s 的长度是 %d \n", normStr1, len(str1))
         
         normStr2, _, _ := transform.String(t, str2)
         fmt.Printf("%s 的长度是 %d \n", normStr2, len(str2))
         
         match2 := strings.EqualFold(normStr1, normStr2)
         fmt.Println(match2)
 }

输出:

ElNiño的长度是7
ElNiño的长度是8
false

规范化的unicode字符串....

厄尔尼诺的长度是7
厄尔尼诺的长度是8
true

注意:

为什么在对字符串进行规范化处理后,其长度仍不相同?

因为 \u00f1o是由一个ñ字符组成的,而 \u0303o是由n和~字符组成的。


如果你对字符串比较感兴趣可以看一下下面链接

https://www.zongscan.com/demo333/96053.html

相关文章