Unicode และ utf8
จัดการข้อความหลายไบต์
Unicode และ utf8 เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน 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 ถึง 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})))
}การถอดรหัสรูนหนึ่งตัว
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")
}คำถามที่พบบ่อย
บทเรียน “Unicode และ utf8” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Unicode และ utf8” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Unicode และ utf8”
จัดการข้อความหลายไบต์ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “Unicode และ utf8” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- รูนเทียบกับไบต์
- ฟังก์ชันในแพ็กเกจ strings
- strings.Builder
- Unicode และ utf8