📝

Go: Unicode コードポイントごとの変換

2022/09/22に公開

コードポイントごとの変換

プログラミング言語Go完全入門の中で出てきたコードポイントごとの変換の部分が分からなかったので調べてみました。

コードポイントごとの変換には、runes.Map関数を用います。
今回は例題コードのアルファベット小文字を大文字に変換するコードを理解していきます。
コード引用先: コードポイントごとの変換

実際のコード

package main

import (
	"fmt"

	"golang.org/x/text/runes"
)

func main() {
	// 小文字を大文字に変換する
	t := runes.Map(func(r rune) rune {
		if 'a' <= r && r <= 'z' {
			return r - ('a' - 'A')
		}
		return r
	})
	// HELLO, WORLD
	fmt.Println(t.String("Hello, World"))

}

この関数はどういう処理が行われているの?

参考:
go - ルーンとは? - スタックオーバーフロー
文字コード対応表

参考記事と対応表を元に紐解いていく

'a'というのは文字列ですが、コードポイント(GoはUTF-8)で表すとで表すと61(16進数)という数値です。

上述の関数の、if 'a' <= r && r <= 'z'は、
if 61 <= r && r <= 7Aと同じで、"r"は"t.String()"の引数に入れた文字列のことを意味しています。
つまり、t.String("Hello, World")の引数に入れた文字列を判定する関数で、引数に指定したものがアルファベットの小文字ということを条件にしていることが分かりました。

Helloのeを例に取ると、eは65です。
if 61 <= e(65) && e(65) <= 7Aが当てはまり、returnの式に移ります。65 - (61 - 41) -> 65 - 20 -> "45"となります。
45は大文字のEです。これが戻り値となります。

もし引数にHを入れた場合Hは48です。61以上7A以下の間に合致しないので、returnの式は適用されず、そのまま出力されます。つまりHはHのまま出力されるということです。

これで"Hello, World"と引数に指定するとHELLO, WORLDが出力されるということでした。

ここの関数は分かるとめっちゃ気持ちよかったです!!

Discussion