0Pricing
Go Academy · บทเรียน

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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. รูนเทียบกับไบต์
  2. ฟังก์ชันในแพ็กเกจ strings
  3. strings.Builder
  4. Unicode และ utf8
← กลับไปที่ Go Academy