Пакет utf8
Обзор
Пакет utf8 реализует функции и константы для поддержки текста в кодировке UTF-8. В него входят функции для преобразования рун в последовательности байтов UTF-8 и обратно. См. https://en.wikipedia.org/wiki/UTF-8
Индекс
Примеры
Файлы пакета
utf8.go
Константы
Основные для кодировки числа.
const (
RuneError = '\uFFFD' // the "error" Rune or "Unicode replacement character"
RuneSelf = 0x80 // characters below RuneSelf are represented as themselves in a single byte.
MaxRune = '\U0010FFFF' // Maximum valid Unicode code point.
UTFMax = 4 // maximum number of bytes of a UTF-8 encoded Unicode character.
) func AppendRune 1.18
func AppendRune(p []byte, r rune) []byte
AppendRune добавляет UTF-8-представление r в конец p и возвращает расширенный буфер. Если руна выходит за допустимый диапазон, функция добавляет представление RuneError.
Пример
Код:
buf1 := utf8.AppendRune(nil, 0x10000)
buf2 := utf8.AppendRune([]byte("init"), 0x10000)
fmt.Println(string(buf1))
fmt.Println(string(buf2))
Вывод:
𐀀 init𐀀
func DecodeLastRune
func DecodeLastRune(p []byte) (r rune, size int)
DecodeLastRune декодирует последнюю UTF-8-последовательность в p и возвращает руну и её ширину в байтах. Если 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 декодирует первую UTF-8-последовательность в p и возвращает руну и её ширину в байтах. Если 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 записывает в p (размер которого должен быть достаточным) UTF-8-представление руны. Если руна выходит за допустимый диапазон, функция записывает представление RuneError. Функция возвращает количество записанных байтов.
Пример
Код:
r := '世' buf := make([]byte, 3) n := utf8.EncodeRune(buf, r) fmt.Println(buf) fmt.Println(n)
Вывод:
[228 184 150] 3
Пример (OutOfRange)
Код:
runes := []rune{
// Less than 0, out of range.
-1,
// Greater than 0x10FFFF, out of range.
0x110000,
// The Unicode replacement character.
utf8.RuneError,
}
for i, c := range runes {
buf := make([]byte, 3)
size := utf8.EncodeRune(buf, c)
fmt.Printf("%d: %d %[2]s %d\n", i, buf, size)
}
Вывод:
0: [239 191 189] � 3 1: [239 191 189] � 3 2: [239 191 189] � 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-представлении руны. Если руна не является допустимым значением для кодирования в UTF-8, функция возвращает -1.
Пример
Код:
fmt.Println(utf8.RuneLen('a'))
fmt.Println(utf8.RuneLen('界'))
Вывод:
1 3
func RuneStart
func RuneStart(b byte) bool
RuneStart сообщает, может ли байт быть первым байтом закодированной, возможно некорректной руны. У второго и последующих байтов два старших бита всегда равны 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
Valid сообщает, состоит ли 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
© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/unicode/utf8/