Unicode وutf8
تعامَل مع النصوص متعددة البايتات
Unicode وutf8 درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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: بايت واحد.
- الأحرف اللاتينية ذات العلامات الصوتية: بايتان عادةً.
- أحرف 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})))
}فك ترميز rune واحدة
تعيد utf8.DecodeRuneInString(s) أول rune وعدد البايتات التي استهلكتها. يتيح لك ذلك المرور عبر السلسلة النصية يدويًا.
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
r, size := utf8.DecodeRuneInString("世界")
fmt.Println(string(r), size)
}تفك range الترميز نيابةً عنك
تنفذ حلقة for range فك ترميز UTF-8 تلقائيًا. يقفز الفهرس في كل خطوة بمقدار حجم rune بالبايتات.
package main
import "fmt"
func main() {
for i, r := range "a世b" {
fmt.Println(i, string(r))
}
}حزمة unicode
تصنّف حزمة unicode وحدات rune المفردة. وتجيب دوال مثل 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(' '))
}تغيير حالة الأحرف حسب rune
تعمل unicode.ToUpper وunicode.ToLower على وحدات rune المفردة، بما في ذلك العديد من الأحرف غير الموجودة في ASCII.
package main
import (
"fmt"
"unicode"
)
func main() {
fmt.Println(string(unicode.ToUpper('a')))
fmt.Println(string(unicode.ToLower('Z')))
}عدّ الأحرف بأمان
اجمع بين الحزمتين لعدّ الأحرف فقط في نص مختلط، مع التعامل مع كل rune بشكل صحيح.
package main
import (
"fmt"
"unicode"
)
func main() {
count := 0
for _, r := range "a1 b2 世!" {
if unicode.IsLetter(r) {
count++
}
}
fmt.Println(count)
}عكس النص باستخدام rune
لعكس النص بأمان، يجب عكس وحدات rune لا البايتات، وإلا ستتفكك الأحرف متعددة البايتات.
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))
}تجميع المفاهيم
أداة تلخيص سريعة: أبلغ عن طول النص بالبايتات، وعدد وحدات rune، وما إذا كان النص 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وحدات rune وتتحقق منها وتفك ترميزها. - تصنّف
unicodeوحدات rune المفردة وتغيّر حالة أحرفها.
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "café 語"
fmt.Println(utf8.RuneCountInString(s), "runes")
}الأسئلة الشائعة
هل درس «Unicode وutf8» مجاني؟
نعم — نص درس «Unicode وutf8» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «Unicode وutf8»؟
تعامَل مع النصوص متعددة البايتات تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «Unicode وutf8»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Runes مقابل Bytes
- دوال الحزمة strings
- strings.Builder
- Unicode وutf8