Unicodeとutf8
マルチバイトテキストを扱います
「Unicodeとutf8」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。
Unicodeが重要な理由
現代のテキストには、アクセント記号、絵文字、ラテン文字以外の文字体系が含まれています。Unicodeでは、すべての文字にコードポイントと呼ばれる番号を割り当てます。
Goは、これらのコードポイントを可変長でエンコードするUTF-8として文字列を保存します。
package main
import "fmt"
func main() {
s := "héllo 世界"
fmt.Println(s)
}文字あたりのバイト数は異なる
UTF-8では、1文字に1~4バイトを使用します。
- ASCII文字:1バイト
- アクセント付きラテン文字:通常2バイト
- CJK文字:通常3バイト
package main
import "fmt"
func main() {
fmt.Println(len("a"))
fmt.Println(len("é"))
fmt.Println(len("世"))
}unicode/utf8 パッケージ
unicode/utf8パッケージはエンコーディングを理解します。utf8.RuneCountInString(s)は、lenとは異なり、文字数を正しく数えます。
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "héllo"
fmt.Println(len(s))
fmt.Println(utf8.RuneCountInString(s))
}UTF-8の検証
文字列を処理する前に、utf8.ValidString(s)を使用して、文字列が正しい形式のUTF-8を保持していることを確認します。
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
fmt.Println(utf8.ValidString("héllo"))
fmt.Println(utf8.ValidString(string([]byte{0xff, 0xfe})))
}1つのルーンをデコードする
utf8.DecodeRuneInString(s)は、先頭のルーンと、そのルーンが消費したバイト数を返します。これにより、文字列を手動で走査できます。
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
r, size := utf8.DecodeRuneInString("世界")
fmt.Println(string(r), size)
}rangeによる自動デコード
for rangeループは、UTF-8をすでにデコードしています。インデックスは各ステップで、ルーンのバイト数だけ進みます。
package main
import "fmt"
func main() {
for i, r := range "a世b" {
fmt.Println(i, string(r))
}
}unicode パッケージ
unicodeパッケージは、個々のルーンを分類します。unicode.IsLetterやunicode.IsDigitなどの関数を使うと、文字についての判定ができます。
package main
import (
"fmt"
"unicode"
)
func main() {
fmt.Println(unicode.IsLetter('A'))
fmt.Println(unicode.IsDigit('7'))
fmt.Println(unicode.IsSpace(' '))
}ルーン単位で大文字と小文字を変換する
unicode.ToUpperとunicode.ToLowerは、ASCII以外の多くの文字を含む個々のルーンに対して動作します。
package main
import (
"fmt"
"unicode"
)
func main() {
fmt.Println(string(unicode.ToUpper('a')))
fmt.Println(string(unicode.ToLower('Z')))
}文字を安全に数える
これらのパッケージを組み合わせると、混在したテキストから、各ルーンを正しく扱いながら文字だけを数えられます。
package main
import (
"fmt"
"unicode"
)
func main() {
count := 0
for _, r := range "a1 b2 世!" {
if unicode.IsLetter(r) {
count++
}
}
fmt.Println(count)
}ルーン単位で反転する
テキストを安全に反転するには、バイトではなくルーンを反転する必要があります。そうしないと、マルチバイト文字が分解されてしまいます。
package main
import "fmt"
func main() {
runes := []rune("a世b")
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
fmt.Println(string(runes))
}まとめて実装する
簡単な概要確認ツールを作成します。バイト長、ルーン数、そしてテキストが有効なUTF-8かどうかを表示します。
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "Go 世界!"
fmt.Println("bytes:", len(s))
fmt.Println("runes:", utf8.RuneCountInString(s))
fmt.Println("valid:", utf8.ValidString(s))
}確認問題
文字数を数える正しい方法を選んでください。
まとめ:Unicodeとutf8
これで、マルチバイトテキストを自信を持って扱えるようになりました。
- Goの文字列はUTF-8であり、文字は1~4バイトを使用します。
unicode/utf8はルーンの数え上げ、検証、デコードを行います。unicodeは個々のルーンを分類し、大文字と小文字を変換します。
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "café 語"
fmt.Println(utf8.RuneCountInString(s), "runes")
}AI チューターと学ぶ Go — 無料
ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。
- コース
- 51
- レッスン
- 203
よくある質問
「Unicodeとutf8」レッスンは無料ですか?
はい。「Unicodeとutf8」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。
「Unicodeとutf8」で何を学びますか?
マルチバイトテキストを扱います ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Go Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Unicodeとutf8」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGo Academyレッスンでコードを書いて実行できますか?
はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Runeとバイト
- stringsパッケージの関数
- strings.Builder
- Unicodeとutf8