Golang - 对单个字节执行ToUpper()操作?

24

我有一个[]byte,名称为b,我想选择其中一个字节b[pos]并将其改为大写(然后小写)。bytes类型有一个名为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]
}
4个回答

33

对于单个字节/符文,您可以使用unicode.ToUpper

b[pos] = byte(unicode.ToUpper(rune(b[pos])))

6
我想提醒OP,bytes.ToUpper()作用于使用UTF-8编码的Unicode代码点的字节切片,而unicode.ToUpper()仅作用于单个Unicode代码点。
通过请求将单个字节转换为大写,OP意味着"b"字节切片包含除UTF-8之外的其他内容,例如ASCII-7或一些8位编码,例如ISO Latin-1。在这种情况下,OP需要编写一个ISO Latin-1 ToUpper() 函数或者必须在使用bytes.ToUpper()unicode.ToUpper()函数之前将ISO Latin-1 (e.g.)字节转换为UTF-8或Unicode。
任何不够完美的方法都会产生潜在的错误。以前提到的两个函数都不能正确地将所有可能的ISO Latin-1(例如)编码字符转换为大写。

我发现了这个方法 https://golang.org/pkg/strings/#ToUpperSpecial,可以将特殊的 Unicode 字符转换为大写。 - Nevermore

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'
}

这个回答中的代码在几个方面上改进了问题中的代码:
  • 这个回答中的代码可以正确返回包含“Z”的棋盘元素的值(运行下面的playground示例以演示)。
  • “Z”和0x85是相同的值,但使用“Z”更容易理解代码。
  • 直接与值“Z”比较更简单,不需要创建一个切片。

playground示例

编辑:根据问题中的新信息重新修订了答案。


那会改变所选字节的值吗? - Nevermore

0

你可以使用 bytes.ToUpper,只需要处理将输入转换为切片,并将输出转换为字节:

package main
import "bytes"

func main() {
   b, pos := []byte("north"), 1
   b[pos] = bytes.ToUpper(b)[pos]
   println(string(b) == "nOrth")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接