go 语言大小写SpecialCase转换

发布于:2025-07-02 ⋅ 阅读:(25) ⋅ 点赞:(0)

背景: 不同语言或者组件的大小写转换规则有小许不同,导致在不同地方计算字符串大小写的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博客

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

- The Go Programming Language


网站公告

今日签到

点亮在社区的每一天
去签到