我有[]byte
,b
,我想选择一个字节b[pos]
并将其更改为大写(然后是小写)bytes
type有一个名为ToUpper()
的方法。如何将其用于单个字节?
ToUpper
OneOfOne效率最高(当调用数千次时),我使用
val = byte(unicode.ToUpper(rune(b[pos])))
为了找到字节并更改值
b[pos] = val
有时候,我想检查一个字节是大写还是小写,而不是改变一个字节的大小写;所有大写的罗马字母字节都低于小写字节的值。
func (b Board) isUpper(x int) bool {
return b.board[x] < []byte{0x5a}[0]
}
答案 0 :(得分:15)
对于单字节/符文,您可以使用unicode.ToUpper
。
b[pos] = byte(unicode.ToUpper(rune(b[pos])))
答案 1 :(得分:3)
我想提醒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()
或{之前将ISO Latin-1(例如)字节转换为UTF-8或unicode {1}}功能。
任何不足都会造成未决的错误。前面提到的函数都没有将所有可能的ISO Latin-1(例如)编码字符正确地转换为大写字母。
答案 2 :(得分:2)
使用以下代码测试板的元素是否为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'
}
本答案中的代码以一些方式改进了问题中的代码:
编辑:自我原始回答时起,根据问题中的新信息修改了答案。
答案 3 :(得分:0)
您可以使用bytes.ToUpper
,您只需要处理使输入成为切片,
并使输出成为一个字节:
package main
import "bytes"
func main() {
b, pos := []byte("north"), 1
b[pos] = bytes.ToUpper(b)[pos]
println(string(b) == "nOrth")
}