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, "")
}

第二种,使用 stringsToUpperSpecialToLowerSpecial 来实现

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
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 来做字符串的全半角相互转换极为方便。

Related articles

Golang http IPv4/IPv6 服务

Golang 的网络服务,如果不指定IPv4 或 IPv6,如果VPS 同时支持 IPv4 和 IPv6,`net.Listen()` 只会监听 IPv6 地址。但这不影响客户端使用 IPv4 地址来访问。...

Golang phantomjs 动态代理实现

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

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

Submit Comment Login
Based on Golang + fastHTTP + youdb | go1.16 Processed in 1ms