Преобразование символов, отличных от ASCII (умляуты, диакритические знаки), в их ближайший эквивалент ASCII (создание ярлыка)

Я ищу способ JavaScript для преобразования символов, отличных от ASCII в строке, в их ближайший эквивалент, аналогично тому, как PHP iconv. Например, если входная строка Rånades på Skyttis i Ö-vik, она должна быть преобразована в Ranades pa skyttis i o-vik. Я просмотрел phpjs, но iconv не включен.

Можно ли выполнить такое преобразование в JavaScript, если да, то как?


person Max    schedule 05.08.2012    source источник
comment
Связанное (но не настоящее универсальное решение): удалить умляуты или специальные символы в строке javascript   -  person Pekka    schedule 05.08.2012
comment
Это может быть изначально невозможно в JavaScript без поддержки огромных таблиц замены (по крайней мере, я никогда не видел способа сделать это). Нет возможности отправить данные на сервер и использовать там iconv?   -  person Pekka    schedule 05.08.2012
comment
Однажды я создал для этого функцию. См. userscripts.org/scripts/review/112070, Ctrl + F var RW759_normalize_accents. Он используется для нормализации символов для поиска, я вручную выбрал символы iirc с помощью инструмента, созданного для конкретной цели. На основе этого вопроса и ответа   -  person Rob W    schedule 05.08.2012
comment
@Pekka: тебе не кажется, что, отредактировав заголовок, ты уменьшил объем вопроса? Изначально я написал non-ASCII characters, который вы заменили на characters with umlauts/accents. Для меня существует множество других символов, кроме umlauts и accents, которые также следует преобразовать: en.wikipedia.org/ wiki / Диакритический знак. Может быть, перефразирование названия на Convert non-ASCII characters (umlauts,accents...) to their closest ASCII equivalent (slug creation) было бы хорошим компромиссом?   -  person Max    schedule 05.08.2012
comment
@user мое (неспециализированное) предположение заключалось в том, что все диакритические знаки покрыты диакритическими знаками. Конечно, продолжайте, это звучит как хороший компромисс   -  person Pekka    schedule 05.08.2012
comment
Если ваш целевой репертуар - это не просто латинские символы с диакритическими знаками, какие символы вы хотите преобразовать и во что они должны быть преобразованы? Если вы можете преобразовать Unicode в полностью разложенную форму, тогда удаление акцентов должно быть тривиальным; но если некоторые из ваших персонажей не составлены, это не поможет. См. Также unicode.org/faq/normalization.html.   -  person tripleee    schedule 05.08.2012
comment
В PHP я использую для этого iconv, но для этого есть перенос на javascript по адресу github.com/ashtuchkin/iconv-lite/tree/master/test   -  person Ekim    schedule 06.08.2012


Ответы (3)


Самый простой способ нашел:

var str = "Rånades på Skyttis i Ö-vik";
var combining = /[\u0300-\u036F]/g; 

console.log(str.normalize('NFKD').replace(combining, ''));

Для справки см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize

person Rez    schedule 13.05.2014
comment
ECMAScript 6. На сегодняшний день он поддерживается только последними альфа-версиями Chrome и Firefox. Хотя многообещающе. - person Álvaro González; 13.05.2014
comment
Я использовал этот метод в NodeJS. Может быть, есть какой-нибудь модуль нормализации Unicode для клиентов, например unorm - person Rez; 14.05.2014
comment
В любом случае Node.js имеет порты iconv. - person Álvaro González; 14.05.2014
comment
Да, но нет необходимости использовать дополнительный модуль - person Rez; 14.05.2014
comment
Как насчет норвежских символов, таких как ø или æ? - person Michal Biros; 01.04.2019

Это потому, что iconv - это собственная скомпилированная утилита UNIX, стоящая за большинством функций преобразования символьных карт i18n.

Вы не найдете его в javascript, если не получите доступ к какому-либо компоненту браузера.

Кодирование - это свойство документа, поэтому большинство реализаций javascript просто игнорируют его.

Вам понадобится чистая библиотека js для строк без акцента. Было бы лучше иметь один для конкретного языка, который вам нужен.

Самый простой способ - использовать некоторые таблицы перевода или даже замену регулярных выражений.

как здесь: http://lehelk.com/2011/05/06/script-to-remove-diacritics/

также проверьте эту ветку: Замена диакритических знаков в Javascript

person kisp    schedule 06.08.2012
comment
Я только что понял, что замена диакритических знаков одним знаком ASCII не идеальна. Например, на немецком языке ü следует преобразовать в ue, а не просто u, см. webmasters.stackexchange.com/questions/33032/. Кажется, что даже iconv не выполняет ir (php -r 'setLocale(LC_ALL,"de_DE"); echo iconv("UTF-8", "ASCII//TRANSLIT", "ü");' // -> u), поэтому я думаю, что я сам создам таблицы перевода (на основе iconv и настроен вручную) и буду использовать их как для JavaCript, так и для PHP. - person Max; 07.08.2012
comment
Согласно этому комментарию пользователя iconv, iconv преобразует ü в ue, если выбран немецкий язык. - person icc97; 10.12.2013

Я бы порекомендовал пакет Unicode, он также сопоставляет греческие и кириллические буквы с их ближайшим символом ascii:

unidecode('Lillı Celiné Никита Ödipus');

'Лилли Селин Никита Одипус'

person Adam    schedule 22.04.2020