Как использовать Unicode :: Normalize для создания наиболее совместимой строки в кодировке Windows-1252?

Я полагаю, вы имеете в виду разметку по умолчанию? Если вы не установите его в onCreate с помощью setContentView , я думаю, у вас его просто не будет.

2
задан serenesat 21 January 2019 в 13:41
поделиться

2 ответа

Я не думаю, что вы упускаете API, потому что достаточно сложный подход. Я бы попробовал что-то вроде следующего:

  • Нормализовать с помощью NFC. Это объединяет разложенные последовательности, такие как LATIN SMALL LETTER U, КОМБИНИРУЮЩИЙ ДИАРЕЗ.
  • Извлеките все кодовые точки, которые не объединяют метки, используя регулярное выражение /\PM/g. Это отбрасывает все метки объединения, оставшиеся после преобразования NFC, которые не могут быть преобразованы в Windows-1252 в любом случае. Затем для каждой кодовой точки:
    • Если кодовая точка может быть преобразована в Windows-1252, сделайте это.
    • В противном случае попытайтесь нормализовать кодовую точку с помощью NFKC. Если отображение NFKC отличается от входного, примените все шаги рекурсивно к результирующей строке. Это обрабатывает такие вещи, как лигатуры.
    • В качестве бонуса: если кодовая точка инвариантна относительно NFKC, преобразуйте ее в NFD и попытайтесь преобразовать первую кодовую точку результата в Windows-1252. Это преобразует символы, такие как Ĝ в G.
    • В противном случае игнорируйте символ.

Существуют, конечно, другие подходы, которые преобразуют неподдерживаемые символы в символы, которые похожи, но они требуют создания отображений вручную.

0
ответ дан nwellnhof 21 January 2019 в 13:41
поделиться

Так как кажется, что вы можете конвертировать отдельные символы по мере необходимости (в кодировку cp-1252), один из способов заключается в том, чтобы обрабатывать символ за символом, как это предлагается, когда слово не проходит процедуру.

\X в регулярном выражении Perl соответствует логическому символу Unicode, расширенному кластеру графем , либо как одна кодовая точка, либо как последовательность. Так что если вы действительно можете преобразовать все отдельные (логические) символы в нужную кодировку, то с помощью

while ($word =~ /(\X)/g) { ... }

вы можете получить доступ к логическим символам и применить свою рабочую процедуру к каждому.

В случае, если вы не можете обработать все логические символы, которые могут появиться, соедините эквивалент \X, используя специфические свойства символов , для более тонкой детализации с комбинированием меток или тому подобного (например, /((.)\p{Mn}?)/ или \p{Nonspacing_Mark}). Полный, большой, список находится в perluniprops .

0
ответ дан zdim 21 January 2019 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: