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