FIRST , я использовал библиотеку Python 3 grapheme для решения моей проблемы.(Подробнее о графеме см. в этой статье ).Но я удивлен, что Python 3 не может сделать это без специализированной библиотеки ...
Я прибег к grapheme , потому что после многих поисков в Интернете и чтения вопросов StackOverflowЯ не смог заставить Python 3 вернуть правильное количество позиций символов в последовательности символов тайского языка.
Например, вот строка UTF-8 символов тайского языка:
thai_str = 'สีโชคดีเป็นสีชมพู สีโชคร้ายเป็นสีเหลืองและขาว'
Я использую термин позиция символа , чтобы определить одну позицию в строке / строке тайских символов.Это связано с тем, что позиция персонажа может состоять из тайского согласного плюс, в некоторых случаях, гласного или тонального маркера выше или ниже этого согласного.Согласный плюс гласный или тональный маркер выше / ниже занимают одну позицию символа в строке Unicode.(У некоторых тайских согласных также могут быть гласные слева, справа или от обоих. Эти гласные занимают свою собственную позицию символа.)
Например, в следующей последовательности, сгенерированной из строки примера, пункты 2 и 7гласные, а пункт 10 является тональным маркером.Каждый использует отдельные байты в строке UTF-8, но не занимает свои собственные позиции символов.Пункты 3 и 8 являются гласными, которые идут слева от согласного и, следовательно, занимают позиции символов.
01: ส
02: ี
03: โ
04: ช
05: ค
06: ด
07: ี
08: เ
09: ป
10: ็
...
45: ว
При попытке определить позиции символов в строке примера, len(thai_str)
возвращает 45
.Что не правильно.Единственный способ получить правильное количество позиций символов - это использовать grapheme.length(thai_str)
для получения 35
.
Я также использовал encode для полученияследующее:
b'\xe0\xb8\xaa\xe0\xb8\xb5\xe0\xb9\x82\xe0\xb8\x8a\xe0\xb8\x84\xe0\xb8\x94...
(Подсчет экземпляров xe0
, которые кажутся предшествующими каждому тайскому символу, не выглядит правильным подходом ...)
SO - единственный способ подсчитать позиции символов в моем примере строки - использовать библиотеку Python 3, такую как grapheme ?