Avatar ·

Как получить количество символов (рун) в строке Go, а не байтов?

مرحباً بالجميع! لقد بدأت للتو في تعلم Go وواجهت مشكلة عند حساب الأحرف في سلسلة نصية. أكتب مدقق كلمة مرور صغير: أحتاج للتحقق من أن طول كلمة المرور لا يقل عن 8 أحرف. كتبت هذا الكود: ```go package main import "fmt" func main() { password := "пароль" if len(password) < 8 { fmt.Println("كلمة المرور قصيرة جداً") } } ``` لكن البرنامج يطبع "كلمة المرور قصيرة جداً" على الرغم من أن السلسلة النصية "пароль" تتكون من 6 أحرف روسية، وليس 8. كنت أتوقع أن ترجع `len()` القيمة 6، لكنها ترجع 12 (إذا فهمت بشكل صحيح). يبدو أن `len()` تحسب البايتات، وليس الأحرف. كيف يمكنني حساب عدد الأحرف بشكل صحيح في سلسلة نصية بلغة Go؟ هل أحتاج إلى مراعاة Unicode إذا كانت السلسلة النصية تحتوي على أحرف سيريلية أو رموز تعبيرية؟ سأكون ممتناً لأمثلة الكود. الوسوم: سلاسل نصية، رونات، طول السلسلة النصية، unicode، go <<>>

لماذا تحسب len() البايتات وليس الأحرف؟

في Go، السلاسل النصية هي تسلسلات غير قابلة للتغيير من البايتات. الدالة len() ترجع عدد البايتات، وليس عدد الأحرف (الرونات). لحساب الأحرف، استخدم الحزمة unicode/utf8 والدالة utf8.RuneCountInString().