Go Academy · レッスン

Unicodeとutf8

マルチバイトテキストを扱います

レッスン 4/413 ステップ

「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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Runeとバイト
  2. stringsパッケージの関数
  3. strings.Builder
  4. Unicodeとutf8
← Go Academyに戻る