Golang - ToUpper()在一个字节上?

时间:2016-07-02 16:17:40

标签: go byte uppercase lowercase

我有[]byteb,我想选择一个字节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]
}

4 个答案:

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

本答案中的代码以一些方式改进了问题中的代码:

  • 答案中的代码返回包含&#39; Z&#39;的电路板元素的正确值。 (在下面运行游乐场示例进行演示)。
  • &#39; Z&#39;和0x85是相同的值,但使用&#39; Z&#39;更容易理解代码。
  • 直接与价值&#39; Z&#39;进行比较更简单。无需创建切片。

playground example

编辑:自我原始回答时起,根据问题中的新信息修改了答案。

答案 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")
}