GolangNote

Golang笔记

golang 全角半角相互转换

Permalink

中文世界常需要全角转半角或半角转全角的功能,记录一下用 golang 实现的方法。

第一种,利用 unicode 编码,直接计算

Go: 利用 unicode 编码,直接计算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 全角转半角
func DBC2SBC(s string) string {
	var strLst []string
	for _, i := range s {
		insideCode := i
		if insideCode == 12288 {
			insideCode = 32
		} else {
			insideCode -= 65248
		}
		if insideCode < 32 || insideCode > 126 {
			strLst = append(strLst, string(i))
		} else {
			strLst = append(strLst, string(insideCode))
		}
	}
	return strings.Join(strLst, "")
}

第二种,使用 stringsToUpperSpecial ToLowerSpecial 来实现

Go: 利用strings库转换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
s := `。,()-1!@234567890abc123456789abc`
numConv := unicode.SpecialCase{
	unicode.CaseRange{
		Lo:0x3002, // Lo 全角句号
		Hi:0x3002, // Hi 全角句号
		Delta:[unicode.MaxCase]rune{
			0,               // UpperCase
			0x002e - 0x3002, // LowerCase 转成半角句号
			0,               // TitleCase
		},
	},
	//
	unicode.CaseRange{
		Lo:0xFF01, // 从全角!
		Hi:0xFF19, // 到全角 9
		Delta:[unicode.MaxCase]rune{
			0,               // UpperCase
			0x0021 - 0xFF01, // LowerCase 转成半角
			0,               // TitleCase
		},
	},
}

fmt.Println(strings.ToLowerSpecial(numConv, s))

解释一下:

Go: ToUpperSpecial
1
2
3
4
5
6
7
8
9
10
11
// ToUpperSpecial 将 s 中的所有字符修改为其大写格式。
// 优先使用 _case 中的规则进行转换
func ToUpperSpecial(_case unicode.SpecialCase, s string) string

// ToLowerSpecial 将 s 中的所有字符修改为其小写格式。
// 优先使用 _case 中的规则进行转换
func ToLowerSpecial(_case unicode.SpecialCase, s string) string

// ToTitleSpecial 将 s 中的所有字符修改为其 Title 格式。
// 优先使用 _case 中的规则进行转换
func ToTitleSpecial(_case unicode.SpecialCase, s string) string

_case 规则说明,以下列语句为例:

Go: _case 规则
1
unicode.CaseRange{'A', 'Z', [unicode.MaxCase]rune{3, -3, 0}}

  • 其中 'A', 'Z' 表示此规则只影响 'A' 到 'Z' 之间的字符。
  • 其中 [unicode.MaxCase]rune 数组表示:
    • 当使用 ToUpperSpecial 转换时,将字符的 Unicode 编码与第一个元素值(3)相加
    • 当使用 ToLowerSpecial 转换时,将字符的 Unicode 编码与第二个元素值(-3)相加
    • 当使用 ToTitleSpecial 转换时,将字符的 Unicode 编码与第三个元素值(0)相加

上面两种比较复杂,特别是第二种,他们都需要这么一张unicode编码表:

unicode编码表

为了简单,建议使用下面第三种方式:

Go: text/width
1
2
3
4
5
6
7
import "golang.org/x/text/width"

s := `。,()-1!@234567890abc123456789abc`
// 全角转半角
fmt.Println(width.Narrow.String(s))
// 半角转全角
fmt.Println(width.Widen.String(s))

这样使用golang 来做字符串的全半角相互转换极为方便。

本文网址: https://golangnote.com/topic/255.html 转摘请注明来源

Related articles

Golang 把cookie 字符串解析为cookie 结构

在做爬虫时有时候会遇到需要带已登录的 cookie 请求,这个时候最简单的方法是在浏览器登录后,在开发者面板找到cookie 字符串,然后拷贝粘贴。这就面临一个问题需要把cookie 字符串解析成Go 语言 cookie 结构体。...

Golang sync.WaitGroup 的 Wait 超时处理

sync.WaitGroup 使用 `Add(1)`、`Done()`、`Wait()`组合来实现多协程等待,如果某一协程未能合理处理错误,导致无法退出,此时需要引入超时机制。下面是一种超时处理方法。...

golang Selenium WebDriver 使用记录

Selenium WebDriver 直接通过浏览器自动化的本地接口来调用浏览器,以达到模拟浏览器行为的操作,如点击、选择、鼠标移动等。下面是记录个人使用golang 驱动的记录。...

golang 实现的基于web的文件管理-filebrowser

FileBrowser 在指定目录中提供了一个文件管理界面,可用于上传,删除,预览,重命名和编辑文件。它允许创建多个用户,每个用户都可以有自己的目录。它可以用作独立的应用程序。...

Golang 实现 10 进制转 N 进制

给定一个不没有重复字符的字符串,如 `[0-9,a-z]`,把一个 10 进制数字转为,该字符集的字符串。应用场合如汽车牌、顺序计数。...

Golang Web 程序生产环境独立部署示例

一个 web 应用通常是跑在一个前端代理,如 Nginx 后,这样可以方便的在同一个服务器部署多个应用。这里说的独立部署是指让 go web 程序直接暴露在外面,独占 443、80 端口(俗称裸跑)。这样做除了性能有些提高外,更重要的是部署方便。...

Write a Comment to "golang 全角半角相互转换"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.22.3 Processed in 0ms