Курс Раку / Основи / Рядки

Довжина рядка

Юнікодна природа рядків робить деякі тривіальні речі трохи складнішими. Або, принаймні, потрібно думати про це як про менш прямолінійну тему. Візьмемо, наприклад, довжину рядка. Це кількість символів, чи кількість байтів? Або що, якщо той самий символ розкладений по-різному в різних рядках, чи все ще це один і той самий символ?

Довжина в символах

Щоб отримати довжину рядка в символах, використовуйте метод chars:

my $str = '你好世界';
say $str.chars;

Хоча ми поговоримо про методи пізніше, ми вже повинні вміти їх використовувати. У Raku ви можете викликати методи майже на кожному об’єкті, включаючи рядки та скалярні змінні. Щоб викликати метод, використовуйте крапку. Отже, тут ми бачимо метод, викликаний на змінній, яка містить рядок: $str.chars.

У цьому китайському привітанні 你好世界 є чотири символи. І $str.chars повертає саме 4.

Довжина в байтах

Для довідки, ось як отримати довжину рядка в байтах. У цьому випадку важливо знати, яке кодування використовується для зберігання рядка:

my $str = '你好世界';
say $str.encode('UTF-8').bytes;

Цього разу програма виводить 12. Зверніть увагу, що у другому рядку ми маємо два виклики методів, з’єднані разом.

Довжина в кодових точках

Для повноти картини, ось ще один корисний метод, який також стосується довжини рядків: codes. Він повертає кількість кодових точок у рядку після його нормалізації. У багатьох випадках codes і chars повертають одне й те саме. Проте в деяких рідкісних випадках, коли, наприклад, ви створили ‘неможливий’ символ, для якого немає єдиної кодової точки у всьому просторі Юнікоду, методи дають різні результати.

say 'x̨'.chars;
say 'x̨'.codes;

Цей символ, , не має окремої кодової точки і може бути сконструйований лише з двох частин: маленької літери x і комбінованого символу 0x0328. Отже, це все ще один символ, але дві кодові точки. Тому програма виводить:

1
2

Практика

Виконайте вікторину, що охоплює зміст цієї теми.

Навігація по курсу

Рядки / Екранування спеціальних символів   |   💪 Вправи: Рядки

Ця сторінка автоматично перекладена за допомогою ChatGPT 4o. Оригінальний текст англійською мовою.

Переклади цієї сторінки: EnglishDeutschEspañolItalianoLatviešuNederlandsБългарскиРусскийУкраїнська