@Skit25
на всё воля Бога

Как заменить utf8 символы?

Здравствуйте!
Текст кишит юникодом. Нужно мультибайтные символы "сбросить" или ресетнуть. Например ā в а. Как это правильно сделать?

Я так понимаю символ "a" основной, а крыжик сверху дополнительный. Возможно, можно как-то отсечь дополнительные символы от основного.

Если конвертировать кодировку строки то будет не bar, а b?r
  • Вопрос задан
  • 1727 просмотров
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Я так понимаю символ "a" основной, а крыжик сверху дополнительный. Возможно, можно как-то отсечь дополнительные символы от основного.

Неправильно понимаете. Символ ã - это отдельная буква в португальском алфавите, в Unicode - U+00E3 Latin small letter a with tilde. Далеко не факт, что вместо неё можно корректно использовать букву a.
А в чём вообще цель такой конвертации? Не проще ли работать в utf-8?
Если это реально необходимо, то посмотрите эту статью: https://habrahabr.ru/post/45489/
Ответ написан
Stalker_RED
@Stalker_RED
Я так понимаю символ "a" основной, а крыжик сверху дополнительный.


Неправильно вы понимаете, это один символ
ā	257
U+101
LATIN SMALL LETTER A WITH MACRON

Можно посмотреть здесь, например: xahlee.info/comp/unicode_index.html

Можете воспользоваться iconv, но желательно знать исходную кодировку.
$result = iconv('Windows-1251', 'ASCII//TRANSLIT', $src);
$result = iconv('UTF-8', 'ASCII//TRANSLIT', $src);
Ответ написан
Комментировать
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'
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы