Golang - 单个字节上的 ToUpper()?
Golang - ToUpper() on a single byte?
我有一个 []byte
、b
,我想 select 一个字节,b[pos]
并将其更改为大写(然后小写) bytes
类型有一个名为 ToUpper()
的方法。如何将其用于单个字节?
在单个字节上调用 ToUpper
OneOfOne给的效率最高(调用上千次时),我用
val = byte(unicode.ToUpper(rune(b[pos])))
为了找到字节并改变值
b[pos] = val
检查字节是否为 Upper
有时候,我不想改变一个字节的大小写,而是想检查一个字节是大写还是小写;所有大写罗马字母字节都低于小写字节的值。
func (b Board) isUpper(x int) bool {
return b.board[x] < []byte{0x5a}[0]
}
使用以下代码测试棋盘的某个元素是否为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'
}
此答案中的代码在几个方面改进了问题中的代码:
- 答案中的代码 returns 包含 'Z' 的棋盘元素的正确值(下面的 运行 游乐场示例用于演示)。
- 'Z'和0x85是同一个值,但是代码用'Z'.
更容易理解
- 直接和数值'Z'比较更简单。无需创建切片。
编辑:自我最初回答以来,根据问题中的新信息修改了答案。
对于单个byte/rune,您可以使用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(例如)编码字符正确转换为大写。
你可以使用bytes.ToUpper
,你只需要处理使输入成为一个切片,
并使输出成为一个字节:
package main
import "bytes"
func main() {
b, pos := []byte("north"), 1
b[pos] = bytes.ToUpper(b)[pos]
println(string(b) == "nOrth")
}
我有一个 []byte
、b
,我想 select 一个字节,b[pos]
并将其更改为大写(然后小写) bytes
类型有一个名为 ToUpper()
的方法。如何将其用于单个字节?
在单个字节上调用 ToUpper
OneOfOne给的效率最高(调用上千次时),我用
val = byte(unicode.ToUpper(rune(b[pos])))
为了找到字节并改变值
b[pos] = val
检查字节是否为 Upper
有时候,我不想改变一个字节的大小写,而是想检查一个字节是大写还是小写;所有大写罗马字母字节都低于小写字节的值。
func (b Board) isUpper(x int) bool {
return b.board[x] < []byte{0x5a}[0]
}
使用以下代码测试棋盘的某个元素是否为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'
}
此答案中的代码在几个方面改进了问题中的代码:
- 答案中的代码 returns 包含 'Z' 的棋盘元素的正确值(下面的 运行 游乐场示例用于演示)。
- 'Z'和0x85是同一个值,但是代码用'Z'. 更容易理解
- 直接和数值'Z'比较更简单。无需创建切片。
编辑:自我最初回答以来,根据问题中的新信息修改了答案。
对于单个byte/rune,您可以使用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(例如)编码字符正确转换为大写。
你可以使用bytes.ToUpper
,你只需要处理使输入成为一个切片,
并使输出成为一个字节:
package main
import "bytes"
func main() {
b, pos := []byte("north"), 1
b[pos] = bytes.ToUpper(b)[pos]
println(string(b) == "nOrth")
}