Golang - 单个字节上的 ToUpper()?

Golang - ToUpper() on a single byte?

我有一个 []byteb,我想 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'比较更简单。无需创建切片。

playground example

编辑:自我最初回答以来,根据问题中的新信息修改了答案。

对于单个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")
}