我有一个[]byte
, b
,我想选择一个字节,b[pos]
并将其更改为大写(然后小写)。bytes
类型有一个称为ToUpper()
的方法。我如何将其用于单个字节?
在单个字节上调用ToUpper
OneOfOne给出了最有效的(当调用数千次时),我使用
val = byte(unicode.ToUpper(rune(b[pos])))
来查找字节并更改值
b[pos] = val
检查byte是否为Upper
有时,我想要检查字节是大写还是小写,而不是改变字节的大小写;所有大写罗马字母字节都小于小写字节的值。
func (b Board) isUpper(x int) bool {
return b.board[x] < []byte{0x5a}[0]
}
对于单个字节/符文,您可以使用unicode.ToUpper
。
b[pos] = byte(unicode.ToUpper(rune(b[pos])))
我想提醒OP, bytes.ToUpper()
操作在字节片中使用UTF-8编码的unicode码点,而unicode.ToUpper()
操作在单个unicode码点上。
通过要求将单个字节转换为大写,OP暗示"b
"字节片包含UTF-8以外的东西,可能是ASCII-7或一些8位编码,如ISO Latin-1(例如)。在这种情况下,OP需要编写一个ISO Latin-1(例如)ToUpper()
函数,或者OP必须在使用bytes.ToUpper()
或unicode.ToUpper()
函数之前将ISO Latin-1(例如)字节转换为UTF-8或unicode。
小于此值将创建一个待处理的bug。前面提到的两个函数都不能正确地将所有可能的ISO Latin-1(例如)编码的字符转换为大写。
使用以下代码测试电路板的元素是否为ASCII大写字母:
func (b Board) isUpper(x int) bool {
v := b.board[x]
return 'A' <= v && v <= 'Z'
}
如果应用程序只需要区分大小写字母,那么就不需要使用下界测试:
func (b Board) isUpper(x int) bool {
return b.board[x] <= 'Z'
}
这个答案中的代码在几个方面改进了问题中的代码:
- 答案中的代码返回包含'Z'的board元素的正确值(运行下面的playground示例进行演示)。
- 'Z'和0x85是相同的值,但是使用'Z'代码更容易理解。
- 直接与值"Z"比较简单。不需要创建切片
操场例子
编辑:从我最初的答案开始,根据问题中的新信息修改了答案。
你可以使用bytes.ToUpper
,你只需要处理使输入片,并使输出为一个字节:
package main
import "bytes"
func main() {
b, pos := []byte("north"), 1
b[pos] = bytes.ToUpper(b)[pos]
println(string(b) == "nOrth")
}