...

パッケージ utf8

import "unicode/utf8"
概要
目次

概要 ▾

utf8 パッケージは,UTF-8 エンコードテキスト用関数と定数を実装します。 rune と UTF-8 バイトシーケンス間の変換関数もあります。

定数

エンコーディングの基本となる番号

const (
    RuneError = '\uFFFD'     // " エラー " ルーンまたは "Unicode 置換文字"
    RuneSelf  = 0x80         // Runeself より下の文字は,それ自体として 1 バイトで表されます。
    MaxRune   = '\U0010FFFF' // 最大有効 Unicode コードポイント。
    UTFMax    = 4            // UTF-8 でエンコードされた Unicode 文字の最大バイト数
)

func DecodeLastRune

func DecodeLastRune(p []byte) (r rune, size int)

DecodeLastRune は, p の最後の UTF-8 エンコードを解凍し,ルーンとその幅をバイト数で返します。 p が空の場合は (RuneError, 0) を返します。 それ以外の場合,エンコーディングが無効な場合は (RuneError, 1) を返します。 どちらも正しい,空でない UTF-8 では不可能な結果です。

UTF-8 が正しくない,範囲外のルーンをエンコードしている,または値に対して可能な限り最短の UTF-8 エンコードではない場合,エンコードは無効です。 他の検証は行われません。

コード:

b := []byte("Hello, 世界")

for len(b) > 0 {
    r, size := utf8.DecodeLastRune(b)
    fmt.Printf("%c %v\n", r, size)

    b = b[:len(b)-size]
}

出力:

界 3
世 3
  1
, 1
o 1
l 1
l 1
e 1
H 1

func DecodeLastRuneInString

func DecodeLastRuneInString(s string) (r rune, size int)

DecodeLastRuneInString は DecodeLastRune に似ていますが,その入力は文字列です。 s が空の場合は (RuneError, 0) を返します。 それ以外の場合,エンコーディングが無効な場合は (RuneError, 1) を返します。 どちらも正しい,空でない UTF-8 では不可能な結果です。

UTF-8 が正しくない,範囲外のルーンをエンコードしている,または値に対して可能な限り最短の UTF-8 エンコードではない場合,エンコードは無効です。 他の検証は行われません。

コード:

str := "Hello, 世界"

for len(str) > 0 {
    r, size := utf8.DecodeLastRuneInString(str)
    fmt.Printf("%c %v\n", r, size)

    str = str[:len(str)-size]
}

出力:

界 3
世 3
  1
, 1
o 1
l 1
l 1
e 1
H 1

func DecodeRune

func DecodeRune(p []byte) (r rune, size int)

DecodeRune は, p の最初の UTF-8 エンコードを解凍し,ルーンとその幅をバイト数で返します。 p が空の場合は (RuneError, 0) を返します。 それ以外の場合,エンコーディングが無効な場合は (RuneError, 1) を返します。 どちらも正しい,空でない UTF-8 では不可能な結果です。

UTF-8 が正しくない,範囲外のルーンをエンコードしている,または値に対して可能な限り最短の UTF-8 エンコードではない場合,エンコードは無効です。 他の検証は行われません。

コード:

b := []byte("Hello, 世界")

for len(b) > 0 {
    r, size := utf8.DecodeRune(b)
    fmt.Printf("%c %v\n", r, size)

    b = b[size:]
}

出力:

H 1
e 1
l 1
l 1
o 1
, 1
  1
世 3
界 3

func DecodeRuneInString

func DecodeRuneInString(s string) (r rune, size int)

DecodeRuneInString は DecodeRune に似ていますが,その入力は文字列です。 s が空の場合は (RuneError, 0) を返します。 それ以外の場合,エンコーディングが無効な場合は (RuneError, 1) を返します。 どちらも正しい,空でない UTF-8 では不可能な結果です。

UTF-8 が正しくない,範囲外のルーンをエンコードしている,または値に対して可能な限り最短の UTF-8 エンコードではない場合,エンコードは無効です。 他の検証は行われません。

コード:

str := "Hello, 世界"

for len(str) > 0 {
    r, size := utf8.DecodeRuneInString(str)
    fmt.Printf("%c %v\n", r, size)

    str = str[size:]
}

出力:

H 1
e 1
l 1
l 1
o 1
, 1
  1
世 3
界 3

func EncodeRune

func EncodeRune(p []byte, r rune) int

EncodeRune は,ルーンの UTF-8 エンコードを p (十分に大きい必要があります) に書き込みます。 書き込まれたバイト数を返します。

コード:

r := '世'
buf := make([]byte, 3)

n := utf8.EncodeRune(buf, r)

fmt.Println(buf)
fmt.Println(n)

出力:

[228 184 150]
3

func FullRune

func FullRune(p []byte) bool

FullRune は, p のバイトがルーンの完全な UTF-8 エンコードで始まるかどうかを報告します。 無効なエンコードは,幅 1 のエラールーンとして変換されるため,フルルーンと見なされます。

コード:

buf := []byte{228, 184, 150} // 世
fmt.Println(utf8.FullRune(buf))
fmt.Println(utf8.FullRune(buf[:2]))

出力:

true
false

func FullRuneInString

func FullRuneInString(s string) bool

FullRuneInString は FullRune に似ていますが,その入力は文字列です。

コード:

str := "世"
fmt.Println(utf8.FullRuneInString(str))
fmt.Println(utf8.FullRuneInString(str[:2]))

出力:

true
false

func RuneCount

func RuneCount(p []byte) int

RuneCount は p のルーン数を返します。 誤ったエンコードや短いエンコードは,幅 1 バイトの単一ルーンとして扱われます。

コード:

buf := []byte("Hello, 世界")
fmt.Println("bytes =", len(buf))
fmt.Println("runes =", utf8.RuneCount(buf))

出力:

bytes = 13
runes = 9

func RuneCountInString

func RuneCountInString(s string) (n int)

RuneCountInString は RuneCount に似ていますが,その入力は文字列です。

コード:

str := "Hello, 世界"
fmt.Println("bytes =", len(str))
fmt.Println("runes =", utf8.RuneCountInString(str))

出力:

bytes = 13
runes = 9

func RuneLen

func RuneLen(r rune) int

RuneLen は,ルーンのエンコードに必要なバイト数を返します。 ルーン文字が UTF-8 でエンコードするのに有効な値ではない場合, -1 を返します。

コード:

fmt.Println(utf8.RuneLen('a'))
fmt.Println(utf8.RuneLen('界'))

出力:

1
3

func RuneStart

func RuneStart(b byte) bool

RuneStart は,そのバイトがエンコードされた,おそらく無効なルーンの最初のバイトになる可能性があるかどうかを報告します。 2 番目以降のバイトは,常に上位 2 ビットが 10 に設定されています。

コード:

buf := []byte("a界")
fmt.Println(utf8.RuneStart(buf[0]))
fmt.Println(utf8.RuneStart(buf[1]))
fmt.Println(utf8.RuneStart(buf[2]))

出力:

true
true
false

func Valid

func Valid(p []byte) bool

有効な p が完全に有効な UTF-8 エンコードされたルーン文字で構成されているかどうかを報告します。

コード:

valid := []byte("Hello, 世界")
invalid := []byte{0xff, 0xfe, 0xfd}

fmt.Println(utf8.Valid(valid))
fmt.Println(utf8.Valid(invalid))

出力:

true
false

func ValidRune 1.1

func ValidRune(r rune) bool

ValidRune は, r が合法的に UTF-8 としてエンコードできるかどうかを報告します。 範囲外または代理半分のコードポイントは違法です。

コード:

valid := 'a'
invalid := rune(0xfffffff)

fmt.Println(utf8.ValidRune(valid))
fmt.Println(utf8.ValidRune(invalid))

出力:

true
false

func ValidString

func ValidString(s string) bool

ValidString は, s が完全に有効な UTF-8 エンコードされたルーンで構成されているかどうかを報告します。

コード:

valid := "Hello, 世界"
invalid := string([]byte{0xff, 0xfe, 0xfd})

fmt.Println(utf8.ValidString(valid))
fmt.Println(utf8.ValidString(invalid))

出力:

true
false