onemuri.space

バイト文字列が表している数字の羅列は ASCII コード

バイト文字列が表している数字は一体何なのでしょうか

私は、PHP,Javascript,Ruby と勉強してきて、golang を 2019 年から触り始めています。その中で byte という型が存在しているのですが、byte の中身は数字の羅列になっていて、頭がパニックを起こしました。いったいあの数列は何を表しているのでしょうか。

本記事ではその実態について解説します

[Question]

golang にて、以下のように string の"abcdef"を byte スライスにすると、数字になります。逆に、byte スライスを string でキャストすると文字列が返ってきます。

一体この数字は何を示しているのでしょうか。

abcdef => 97 98 99 100 101 102 103

連番になっているので、何かに準拠しているのだとは思うのですが…

[]byte("abcdefg") => 97 98 99 100 101 102 103

string([]byte{97, 98, 99, 100, 101, 102, 103}) => abcdef

[Answer]

これは UTF-8 という文字コードで文字列をエンコードした結果の数値です。特に abcdefg という文字列では、ASCII という古くから使われている文字コードと一致します。

参照: ASCII コード表

コンピュータの内部では全て数値でデータを保存しているので、文字列データも内部的には数値の列として保存されています。Go においては文字列は全て Unicode の UTF-8 という文字コードのルールに従って数値化されており、このルールに従うと "a" は 97、"b" は 98、といった風になります。UTF-8 や ASCII では a ~ z、A ~ Z の文字に対応する数値はそれぞれ連番になっており、"abc" を数値列にすると連番になったというわけです。

少しだけ注意が必要なのは、1 文字 1 byte という訳ではないということです。たとえば……

func printBytes(s string) {
  fmt.Println([]byte(s))
}

func main() {
  printBytes("a")
  printBytes("あ")
  printBytes("α")
  printBytes("😋")
  printBytes("👨‍👩‍👦‍👦")
}

出力:

[97][227 129 130]
[206 177][240 159 152 139]
[240 159 145 168 226 128 141 240 159 145 169 226 128 141 240 159 145 166 226 128 141 240 159 145 166]

https://play.golang.org/p/KCoJqjlubGq

まとめ

いかがだったでしょうか?静的型付け言語では byte 文字列を扱う機会が多くあると思いますが、数字としての理解のままでいると怖い何かという気持ちで逃げ出したくなるのではないでしょうか。こうやって怖いものを1つずつ解消していくと過度に怖がる必要はなくなりますね。

自己紹介用画像

Riki Akagi

2019年からDeNAで働いています。GCP(CloudSQL・GAE・Cloud Function etc)とGoでAPI開発に勤んでいます。睡眠やエンジニアリングに関することに興味を持って過ごしているのでその情報を皆さんに共有していけたらなと思っています。

自己紹介の詳細