1// Copyright 2013 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package utf8_test
6
7import (
8	"fmt"
9	"unicode/utf8"
10)
11
12func ExampleDecodeLastRune() {
13	b := []byte("Hello, 世界")
14
15	for len(b) > 0 {
16		r, size := utf8.DecodeLastRune(b)
17		fmt.Printf("%c %v\n", r, size)
18
19		b = b[:len(b)-size]
20	}
21	// Output:
22	// 界 3
23	// 世 3
24	//   1
25	// , 1
26	// o 1
27	// l 1
28	// l 1
29	// e 1
30	// H 1
31}
32
33func ExampleDecodeLastRuneInString() {
34	str := "Hello, 世界"
35
36	for len(str) > 0 {
37		r, size := utf8.DecodeLastRuneInString(str)
38		fmt.Printf("%c %v\n", r, size)
39
40		str = str[:len(str)-size]
41	}
42	// Output:
43	// 界 3
44	// 世 3
45	//   1
46	// , 1
47	// o 1
48	// l 1
49	// l 1
50	// e 1
51	// H 1
52
53}
54
55func ExampleDecodeRune() {
56	b := []byte("Hello, 世界")
57
58	for len(b) > 0 {
59		r, size := utf8.DecodeRune(b)
60		fmt.Printf("%c %v\n", r, size)
61
62		b = b[size:]
63	}
64	// Output:
65	// H 1
66	// e 1
67	// l 1
68	// l 1
69	// o 1
70	// , 1
71	//   1
72	// 世 3
73	// 界 3
74}
75
76func ExampleDecodeRuneInString() {
77	str := "Hello, 世界"
78
79	for len(str) > 0 {
80		r, size := utf8.DecodeRuneInString(str)
81		fmt.Printf("%c %v\n", r, size)
82
83		str = str[size:]
84	}
85	// Output:
86	// H 1
87	// e 1
88	// l 1
89	// l 1
90	// o 1
91	// , 1
92	//   1
93	// 世 3
94	// 界 3
95}
96
97func ExampleEncodeRune() {
98	r := '世'
99	buf := make([]byte, 3)
100
101	n := utf8.EncodeRune(buf, r)
102
103	fmt.Println(buf)
104	fmt.Println(n)
105	// Output:
106	// [228 184 150]
107	// 3
108}
109
110func ExampleEncodeRune_outOfRange() {
111	runes := []rune{
112		// Less than 0, out of range.
113		-1,
114		// Greater than 0x10FFFF, out of range.
115		0x110000,
116		// The Unicode replacement character.
117		utf8.RuneError,
118	}
119	for i, c := range runes {
120		buf := make([]byte, 3)
121		size := utf8.EncodeRune(buf, c)
122		fmt.Printf("%d: %d %[2]s %d\n", i, buf, size)
123	}
124	// Output:
125	// 0: [239 191 189] � 3
126	// 1: [239 191 189] � 3
127	// 2: [239 191 189] � 3
128}
129
130func ExampleFullRune() {
131	buf := []byte{228, 184, 150} // 世
132	fmt.Println(utf8.FullRune(buf))
133	fmt.Println(utf8.FullRune(buf[:2]))
134	// Output:
135	// true
136	// false
137}
138
139func ExampleFullRuneInString() {
140	str := "世"
141	fmt.Println(utf8.FullRuneInString(str))
142	fmt.Println(utf8.FullRuneInString(str[:2]))
143	// Output:
144	// true
145	// false
146}
147
148func ExampleRuneCount() {
149	buf := []byte("Hello, 世界")
150	fmt.Println("bytes =", len(buf))
151	fmt.Println("runes =", utf8.RuneCount(buf))
152	// Output:
153	// bytes = 13
154	// runes = 9
155}
156
157func ExampleRuneCountInString() {
158	str := "Hello, 世界"
159	fmt.Println("bytes =", len(str))
160	fmt.Println("runes =", utf8.RuneCountInString(str))
161	// Output:
162	// bytes = 13
163	// runes = 9
164}
165
166func ExampleRuneLen() {
167	fmt.Println(utf8.RuneLen('a'))
168	fmt.Println(utf8.RuneLen('界'))
169	// Output:
170	// 1
171	// 3
172}
173
174func ExampleRuneStart() {
175	buf := []byte("a界")
176	fmt.Println(utf8.RuneStart(buf[0]))
177	fmt.Println(utf8.RuneStart(buf[1]))
178	fmt.Println(utf8.RuneStart(buf[2]))
179	// Output:
180	// true
181	// true
182	// false
183}
184
185func ExampleValid() {
186	valid := []byte("Hello, 世界")
187	invalid := []byte{0xff, 0xfe, 0xfd}
188
189	fmt.Println(utf8.Valid(valid))
190	fmt.Println(utf8.Valid(invalid))
191	// Output:
192	// true
193	// false
194}
195
196func ExampleValidRune() {
197	valid := 'a'
198	invalid := rune(0xfffffff)
199
200	fmt.Println(utf8.ValidRune(valid))
201	fmt.Println(utf8.ValidRune(invalid))
202	// Output:
203	// true
204	// false
205}
206
207func ExampleValidString() {
208	valid := "Hello, 世界"
209	invalid := string([]byte{0xff, 0xfe, 0xfd})
210
211	fmt.Println(utf8.ValidString(valid))
212	fmt.Println(utf8.ValidString(invalid))
213	// Output:
214	// true
215	// false
216}
217
218func ExampleAppendRune() {
219	buf1 := utf8.AppendRune(nil, 0x10000)
220	buf2 := utf8.AppendRune([]byte("init"), 0x10000)
221	fmt.Println(string(buf1))
222	fmt.Println(string(buf2))
223	// Output:
224	// ��
225	// init��
226}
227