背景: 不同语言或者组件的大小写转换规则有小许不同,导致在不同地方计算字符串大小写的md5不一样。需要依据特定语言或者组件对齐大小写转换。
解决方案:根据不同平台,使用不同的大小写转换。本文以小写为例。
官方支持:
func ToLowerSpecial(c unicode.SpecialCase, s string) string
func 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 main
import (
"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博客