Ответы пользователя по тегу Unicode
  • Как заменить utf8 символы?

    TrueBers
    @TrueBers
    Гуглю за еду
    Правильно понимаете.
    Осталось понять, для чего вам это нужно. Вероятно, вы хотите поиск реализовать? Типа ищешь 'а', при этом матчится 'ā'? Других вариантов не могу придумать...

    Если так, то достаточно при поиске использовать форму декомпозиции NFKC с последующей канонической рекомпозицией. Она проводит рекомпозицию по правилам совместимости, будут матчиться даже те глифы, которые визуально не похожи на исходный. Т. е. когда в языке может заменяться один символ на абсолютно другой, но при этом иметь то же самое значение.

    Если нужно "просто снять крыжечку", то используйте обычную каноническую декомпозицию NFD. Она разберёт всё на составные части. Потом нужно пройтись снова по массиву и очистить диакритику, т. е. можно взять категории Lu и Ll, если у вас чистый текст, либо очистить от Mn будет достаточно.

    Пример на Питоне:
    >>> import unicodedata
    >>> unicodedata.decomposition(unicodedata.lookup('LATIN SMALL LETTER A WITH MACRON'))
    '0061 0304'
    >>> unicodedata.decomposition(unicodedata.lookup('LATIN SMALL LETTER A WITH TILDE'))
    '0061 0303'
    Ответ написан
    8 комментариев
  • Как вывести символ Юникода категории Cf?

    TrueBers
    @TrueBers
    Гуглю за еду
    Ну, а слово JOINER ни о чём не говорит? Переведите с английского инфинитив и узнаете, почему он непечатаемый.

    Join — значит присоединять, примыкать. Эти символы просто соединяют несколько глифов, как будто бы это один глиф. С той разницей лишь, что первый соединяет не предназначенные для соединения глифы, а второй — разделяет лигатуры из нескольких глифов, если они существуют.
    Это, в основном, используется в арабском, всяких хинди, и прочих языках с вязью.

    На кой, простите, чёрт вам арабский в именах переменных, вы можете объяснить?
    Различать вам их нужно только, если вы пишете библиотеку для обработки арабского текста или иврита, например. В других случаях это знать не нужно.
    Ответ написан
    2 комментария
  • Как UTF-8 помещается в char?

    TrueBers
    @TrueBers
    Гуглю за еду
    А никак не помещается.
    Потому что Си не поддерживает обработку строк в UTF-8. Для этого нужны сторонние библиотеки, которые умеют делать нормализацию, считать длину строки в абстрактных символах, а не кодпоинтах, и т. д. Поддержки этого всего у Си и C++ из коробки нет.
    Ну, вы можете, конечно, запихнуть UTF-8 поток в массив char'ов, но ни одна нативная функция для работы со строками не будет с ним работать правильно. Даже длину строки никогда не сможет посчитать.

    Поэтому, ответ прост: в C/C++ для работы с UTF8 используйте стороннюю библиотеку.
    И да, никогда не используйте wchar_t нигде, где не можете этого избежать, например, в апи сторонних библиотек. wchar_t это тупо костыль в дизайне языка, который признали даже создатели этих языков.
    Ответ написан