12 August 2014
东西很简单,主要围绕Golang包的源码和Golang语言特性进行介绍。

将字符串里面的英文小写转成大写,是一个很简单的操作。每个字符的编码可以认为是整数,Golang里面的byteruneuint8int32。其它语言大同小异。在编码表当中,位置是是从AZ,接着是azA对应的整数是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两种编码方式。分别对应的数据类型是byterune。通过[]byte(str)[]rune(str)可以将字符串转成UTF8和UTF16两种解析方式。解析的字符串可能是中文,所以要按照rune处理。对于中文等其他字符,不做处理,所以增加了if r <= MaxASCII过滤。

还有要注意的一点,Golang语言层面实现了字符串string。它不同于C语言里面的字符数组,所以不能够通过下标修改字符串内容。只能通过下标读取。

本文所涉及到的完整源码请参考


参考文献

原文链接:把一个字符串中的字符从小写转为大写,转载请注明来源!

EOF