Как перебирать кластеры графем Unicode в Rust? - PullRequest
2 голосов
/ 08 ноября 2019

Я изучаю Rust, и меня просто удивил тот факт, что Rust способен различать только последовательности байтов UTF-8, но не фактические кластеры графем (т. Е. Диакритический знак рассматривается как отдельный «символ»).

Так, например, Rust может преобразовать входной текст в вектор, подобный этому (с помощью "नमस्ते".chars()):

['न', 'म', 'स', '्', 'त', 'े'] // 4 and 6 are diacritics and shouldn't be distinct items

Но как мне получить такой вектор?

["न", "म", "स्", "ते"]

1 Ответ

4 голосов
/ 08 ноября 2019

Вы хотите использовать unicode-segmentation ящик :

use unicode_segmentation::UnicodeSegmentation; // 1.5.0

fn main() {
    for g in "नमस्ते्".graphemes(true) {
        println!("- {}", g);
    }
}

( Детская площадка , примечание: редактор игровой площадки может 't правильно обрабатывает строку, поэтому позиция курсора в этой строке неправильная)

Это печатает:

- न
- म
- स्
- ते्

true в качестве аргумента означает, что мы хотим выполнить итерацию по расширенномуграфем кластеров. См. graphemes документацию для получения дополнительной информации.


Сегментация в кластеры графем Unicode в какой-то момент поддерживалась стандартной библиотекой, но, к сожалению, она была удалена из-за размеранеобходимые таблицы Unicode. Вместо этого де-факто решение состоит в том, чтобы использовать ящик. Но да, я думаю, что очень жаль, что «сегментация стандартной библиотеки по умолчанию» использует кодовые точки, которые семантически не имеют большого смысла (то есть подсчет их или деление их, как правило, не имеет смысла).

...