_[]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]
}
_
シングルバイト/ルーンの場合、 unicode.ToUpper
。
b[pos] = byte(unicode.ToUpper(rune(b[pos])))
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(例)でエンコードされた可能性のあるすべての文字を大文字に適切に変換しません。
次のコードを使用して、ボードの要素が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'
}
この回答のコードは、いくつかの点で質問のコードを改善しています。
編集:私の元の回答の時以来の質問の新しい情報に基づいて改良された回答。