在单个字节上使用Golang - ToUpper()



我有一个[]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")
}

相关内容

  • 没有找到相关文章

最新更新