web-dev-qa-db-ja.com

Golang-1バイトのToUpper()?

_[]byte_、bがあり、1バイトの_b[pos]_を選択して、大文字(そして小文字)に変更したいbytesタイプToUpper()というメソッドがあります。これを1バイトに使用するにはどうすればよいですか?

シングルバイトでToUpperを呼び出す

OneOfOneは(何千回も呼び出すときに)最も効率的で、私は

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

バイトを見つけて値を変更するため

_b[pos] = val
_

バイトが上位かどうかの確認

時々、バイトの大文字と小文字を変更する代わりに、バイトが大文字か小文字かを確認してください;すべての大文字のroman-alphabetバイトは値より低い小文字のバイトです。

_func (b Board) isUpper(x int) bool {
    return b.board[x] < []byte{0x5a}[0]
}
_
14
Nevermore

シングルバイト/ルーンの場合、 unicode.ToUpper

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

bytes.ToUpper()はバイトスライスでUTF-8を使用してエンコードされたユニコードコードポイントで動作し、unicode.ToUpper()は単一のユニコードコードポイントで動作することをOPに思い出させたいと思います。

OPは、1バイトを大文字に変換するように要求することにより、「b」バイトスライスにUTF-8以外のもの、おそらくASCII-7またはISOLatin-1などの8ビットエンコーディングが含まれていることを意味します。 (例えば)。その場合、OPはISO Latin-1(eg)ToUpper()関数を書き込む必要があります。または、OPはbytes.ToUpper()を使用する前に、ISO Latin-1(eg)バイトをUTF-8またはUnicodeに変換する必要があります。またはunicode.ToUpper()関数。

それ以下のものは、保留中のバグを作成します。前述の関数はいずれも、ISO Latin-1(例)でエンコードされた可能性のあるすべての文字を大文字に適切に変換しません。

4
Doug Henderson

次のコードを使用して、ボードの要素が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」を含むボード要素の正しい値を返します(デモ用に以下の遊び場の例を実行してください)。
  • 「Z」と0x85は同じ値ですが、コードは「Z」を使用すると理解しやすくなります。
  • 値「Z」と直接比較する方が簡単です。スライスを作成する必要はありません。

遊び場の例

編集:私の元の回答の時以来の質問の新しい情報に基づいて改良された回答。

2
Cerise Limón