当前位置: 首页 > news >正文

go 语言大小写SpecialCase转换

背景: 不同语言或者组件的大小写转换规则有小许不同,导致在不同地方计算字符串大小写的md5不一样。需要依据特定语言或者组件对齐大小写转换。

解决方案:根据不同平台,使用不同的大小写转换。本文以小写为例。

官方支持:

func ToLowerSpecial(c unicode.SpecialCase, s string) stringfunc ToUpperSpecial(c unicode.SpecialCase, s string) string// 这两个方法和ToLower、ToUpper很像,就是可以指定优先规则// 规则可以自定义 unicode.CaseRange切片
// unicode.CaseRange
// Lo Hi  表示影响范围
// Delta 具体的影响 [unicode.MaxCase]rune{x, y, z}
//      x 影响 ToUpperSpecial ,将字符的 Unicode 编码与x相加
//      y 影响 ToLowerSpecial ,将字符的 Unicode 编码与y相加
//      z 影响 ToTitleSpecial ,将字符的 Unicode 编码与z相加func demo() {var str = "Hello World..."var speCase = unicode.SpecialCase{unicode.CaseRange{'H', 'H', [unicode.MaxCase]rune{'a' - 'H', 'b' - 'H', 0}},}fmt.Println(strings.ToUpperSpecial(speCase, str)) // aELLO WORLD...fmt.Println(strings.ToLowerSpecial(speCase, str)) // bello world...
}// 自定义SpecialCase,内部定义了两个规则
// unicode.CaseRange{'H', 'H', [unicode.MaxCase]rune{'a' - 'H', 'b' - 'H', 0}},
// 表示影响从H到H,就是H本身,如果写A, Z 则表示影响A~Z
// 影响规则是:
// x = a-H,使用ToUpperSpecial,匹配到影响范围内的字符就是H,需要使用其Unicode编码加x,H + x = a
// y = b-H, 使用ToLowerSpecial, 匹配到影响范围内的字符就是H, 需要使用其Unicode编码加y,H + y = b
// z = 0, 加不加都没得影响
// 总结一下第一个unicode.CaseRange的作用就是,我们使用 ToUpperSpecial将 H 转换成a,使用ToLowerSpecial将 H 转换成b

实战监测大小写不符目标字符的码点:

package mainimport ("fmt""strings""unicode/utf8""os""log"
)func main() {file1name := "65535.txt"file, err := os.OpenFile(file1name, os.O_APPEND|os.O_WRONLY, 0644)if err != nil {// 如果文件不存在,创建文件if os.IsNotExist(err) {file, err = os.Create(file1name)if err != nil {log.Fatal(err)}defer file.Close()} else {log.Fatal(err)}}defer file.Close()for i := 0; i < 65535; i++ {index := rune(i)                          //码点str:=fmt.Sprintf("%c", index)             //字符串sup := strings.ToUpper(str)supR, _ := utf8.DecodeRuneInString(sup)    //string大写slo := strings.ToLower(str)sloR, _ := utf8.DecodeRuneInString(slo)  //string小写log.Printf("%U\t%s\t%U\t%s\t%U\t%s\n", index, str, supR, sup, sloR, slo)line := fmt.Sprintf("%U\t%s\t%U\t%c\t%U\t%c\n", index, str, supR, supR, sloR, sloR )_, _ = file.Write([]byte(line))}

替换逻辑:

用ToLowerSpecial(c unicode.SpecialCase, s string) string
替换ToLower(s string) string
并补充unicode.SpecialCase字符集和映射规则

可参考:

strings.ToLowerSpecial 使用详解_strings tolowerspecial-CSDN博客

https://zhuanlan.zhihu.com/p/676382636

- The Go Programming Language

http://www.lqws.cn/news/582841.html

相关文章:

  • window显示驱动开发—全屏模式
  • [论文阅读] Neural Architecture Search: Insights from 1000 Papers
  • Apache Seata < 2.3.0 raft反序列化漏洞
  • Clickhouse源码分析-TTL执行流程
  • 【Debian】1- 安装Debian到物理主机
  • 解决 VS Code Remote-SSH “无法安装 VS Code 服务器“ 错误的完整指南
  • 【RTSP从零实践】3、实现最简单的传输H264的RTSP服务器
  • 刚体模拟的核心流程:从物理建模到计算执行的全步骤解析
  • PCL点云库入门(第21讲)——PCL库点云特征之RSD特征描述Radius-based Surface Descriptor(RSD)
  • java JNDI高版本绕过 工具介绍 自动化bypass
  • jvm的调优命令jstack打印堆栈信息阐述以及调优
  • Android 四大组件
  • [6-02-01].第05节:配置文件 - YAML配置文件语法
  • xml.etree.ElementTree.ParseError: parsing finished: 错误原因定位
  • [创业之路-453]:企业经营层 - 红海思维 VS 蓝海思维全方位比较
  • vue中表尾合计
  • python训练day45 Tensorborad使用介绍
  • 【数据挖掘】数据挖掘综合案例—银行精准营销
  • UserWarning: Module “zipline.assets“ not found解决方法
  • 自由学习记录(65)
  • ThreadLocal、InheritableThreadLocal与TransmittableThreadLocal深度解析
  • 【Linux】网络基础
  • Git 常用命令、常用错误的总结
  • Kotlin空安全与异常处理
  • 国内Oracle大师认证
  • 深入比较 Gin 与 Beego:Go Web 框架的两大选择
  • 《燕云十六声》全栈技术架构深度解析
  • DFMEA检查表模板下载
  • js代码03
  • 第三十五章 I2S——音频传输接口