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 生成防识别的图片验证码

验证码 captcha 是对抗密码强力破解、垃圾信息的有效方式,一般用于用户注册、登录,当检测到频繁发帖时也会启用验证码。下面介绍用golang 生成防机器识别的图片验证码。...

Golang telegram 机器人小试

telegram 的机器人接口很开放,使用简单,100%开放无限制,相对微信服务号、公众号好很多。用来做一些小应用也很方便。下面是使用golang sdk 开发telegram 机器人的经验。...

golang Selenium WebDriver 使用记录

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

Golang phantomjs 动态代理实现

phantomjs 是个很优秀的软件,虽然现在被chrome headless 抢了风头,但在某些特定场合,使用phantomjs 还是很方便,这里是介绍使用Go 实现动态代理。...

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

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