把一个字符串中的字符从小写转为大写
12 August 2014
东西很简单,主要围绕Golang包的源码和Golang语言特性进行介绍。
将字符串里面的英文小写转成大写,是一个很简单的操作。每个字符的编码可以认为是整数,Golang里面的byte
和rune
是uint8
和int32
。其它语言大同小异。在编码表当中,位置是是从A
到Z
,接着是a
到z
,A
对应的整数是65,a
对应的整数是97,中间差了26个英文字母和6个其它字符的长度共32。所以转换的方法就是,将小写字母的值,剪掉32即可。
还是编码的问题。最早的出现的编码是ASCII,从128个增加到256个字符。再到后面的Unicode、GBK等,这些新出的编码和最早的ASCII都是兼容的,也就是说,不同的编码里面,前256位都是一样的。所以,在这里的英文字符转大写问题,不存在编码问题。
这个题目在Golang的strings
包里有专门的实现ToUpper
,此函数内部封装了unicode
包,在此包的letter.go
文件内,是具体的实现。
const MaxASCII = '\u007F'
func toUpper(r rune) rune {
if r <= MaxASCII {
if 'a' <= r && r <= 'z' {
r -= 'a' - 'A'
}
return r
}
return r
}
func ToUpper(s []rune) (res []rune) {
for i := 0; i < len(s); i++ {
res = append(res, toUpper(s[i]))
}
return res
}
func main() {
a := "Hello, 世界"
fmt.Println(string(ToUpper([]rune(a))))
}
大Golang支持UTF8和Unicode两种编码方式。分别对应的数据类型是byte
和rune
。通过[]byte(str)
和[]rune(str)
可以将字符串转成UTF8和UTF16两种解析方式。解析的字符串可能是中文,所以要按照rune
处理。对于中文等其他字符,不做处理,所以增加了if r <= MaxASCII
过滤。
还有要注意的一点,Golang语言层面实现了字符串string
。它不同于C语言里面的字符数组,所以不能够通过下标修改字符串内容。只能通过下标读取。
本文所涉及到的完整源码请参考。
参考文献
- 【1】Source file src/pkg/strings/strings.go - The Go Programming Language
- 【2】ASCII - Wikipedia
- 【3】Source file src/pkg/unicode/letter.go - The Go Programming Language
原文链接:把一个字符串中的字符从小写转为大写,转载请注明来源!
–EOF–