Я хотел бы сделать транслитератор с корейского алфавита (хунгул) на латинский алфавит (латинизация), но кажется, что (после многократного использования много раз без успеха) использование простого связанного массива не является правильным делать.
Вот метод, который я пытался работать на до сих пор:
https://gist.github.com/1154969
Я попытался заменить Хирагану корейскими слогами, но я не мог заставить его работать.
у кого-нибудь есть решение?
Романтизация текста проста, но наоборот. Например, на японском языке (который я знаю лучше, чем корейский), な ん записывается как «нан», первый слог – «na», а второй – «n». Ваш код должен каким-то образом различать два слога, потому что, если он превратит первый n в ん вместо второго, ваш синтаксический анализатор останется с «an», что является несуществующим слогом на японском языке.
Способ приблизиться к этому в его самой базовой форме должен включать ассоциативный массив. Вместо того, чтобы заменять ключи своими значениями за один раз, вам придется сначала искать самые длинные слоги и заменять их за один раз. Итак, во-первых, вы пойдете на слоги типа «ши», для слогов вроде «na» и, наконец, для слогов типа «n». Если вы это сделаете, все азиатские языки, о которых я знаю, должны быть безопасно переведены обратно в их собственный алфавит, хотя имейте в виду, что это может все еще вызвать проблемы, если разные слоги имеют одну и ту же романтизированную форму письма.
Поскольку вы просто хотите развернуть некоторые конкретные символы (слоты хунгула) в исходной строке на другие заранее определенные последовательности (латинизация), используйте комбинацию поиска объектов, в которой вы храните хангул в качестве ключа и латинизацию как значение и способность String.replace
генерировать замены через функцию.
Я буду использовать katakana как часть примера, потому что я тоже хорошо знаю японский язык :), но вам нужно всего лишь заполнить таблицу заметок правильным хангулом, чтобы он работал:
var hangul_syllable_to_roman = { '가' : 'ga', '강' : 'gang', 'カ' : 'ka', 'タ' : 'ta', 'ナ' : 'na' } function one_hangul_syllable_to_roman(syllable) { var roman = hangul_syllable_to_roman[syllable] // if we have suitable replacement - do it, if not - just return original back if (roman) { return roman } else { return syllable } } function hangul_to_roman(hangul) { return hangul.replace(/./gm, one_hangul_syllable_to_roman) } document.write(hangul_to_roman('가강 カタカナ some other text')) // gagang katakana some other text