Романизация текста в Юникоде - PullRequest
22 голосов
/ 23 марта 2012

Я ищу способ транслитерации букв Unicode с любого языка в латинские буквы с ударениями. Цель состоит в том, чтобы позволить иностранцам получить представление о произношении имен и слов, написанных любым нелатинским шрифтом.

Примеры:

Греческий: Romanize("Αλφαβητικός") возвращает "Alphabētikós" (или "Alfavi̱tikós")

Японский: Romanize("しんばし") возвращает "shimbashi" (или "sinbasi")

Русский: Romanize("яйца Фаберже") возвращает "yaytsa Faberzhe" (или "jajca Faberže")

В идеале он должен поддерживать символы в следующих сценариях: CJK, Indic, Cyrillic, Semitic и Greek. Он должен быть управляемым данными и расширяемым, используя данные консорциума Unicode, США, ЕС или ООН. Код должен быть с открытым исходным кодом, написанным на .NET или Java.

Существует ли такая библиотека?

Ответы [ 4 ]

16 голосов
/ 24 марта 2012

Проблема намного сложнее, чем вы думаете.

Греческий, кириллица, индийский алфавит, грузинский -> тривиально, вы можете запрограммировать это за час
тайский, японский кана -> выполнимо с небольшим усилием
японский кандзи, китайский -> этине являются алфавитами / слогами, так что вы на самом деле не транслитерируете, вы ищете произношение каждого символа в надежно большом словаре (EDICT и CCDICT должны работать), и много раз вы ошиблись, есливы также рассматриваете контекст, особенно на японском
корейский -> технически алфавит, но компьютеры могут обрабатывать только составные символы, поэтому вам нужна другая большая база данных, я не знаю ни одного
арабского, иврита-> эти языки не записывают короткие гласные, поэтому часто ваша транслитерация будет чем-то нечитаемым, например, «bytlhm» (Вифлеем).Я не знаю каких-либо больших баз данных, которые сопоставляют арабские или ивритские слова с их произношением.

7 голосов
/ 01 марта 2013

Вы можете использовать Unidecode Sharp :

порт [C #] из Python Unidecode , который сам портируется из Perl unidecode ,(также доступны реализации PHP и Ruby )

Использование;

using BinaryAnalysis.UnidecodeSharp;

.......................................

string _Greek="Αλφαβητικός";
MessageBox.Show(_Greek.Unidecode());

string _Japan ="しんばし";
MessageBox.Show(_Japan.Unidecode());

string _Russian ="яйца Фаберже";
MessageBox.Show(_Russian.Unidecode());

Надеюсь, это будет хорошо для вас.

6 голосов
/ 23 марта 2012

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

4 голосов
/ 23 марта 2012

Хранилище данных Unicode Common Locale имеет отображений транслитерации , которые вы можете использовать.

...