在go语言中规范化unicode字符串用于比较的目的代码示例
Go  /  管理员 发布于 2年前   533
下面是一个关于如何规范化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和~字符组成的。
如果你对字符串比较感兴趣可以看一下下面链接
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号