Это либо невозможно, либо тривиально.Вот тривиальные подходы:
Если ни одна кодовая точка не превышает 127, просто запишите ее в ASCII.Готово.
Если некоторые кодовые точки превышают 127, вы должны выбрать, как их представлять в ASCII.Обычной стратегией является использование синтаксиса XML, как в α
для U + 03B1.Это займет до 8 символов ASCII для каждой транскрибируемой кодовой точки Unicode транс-ASCII.
Невозможные, которые я оставлю в качестве упражнения для оригинального плаката.Я даже не буду упоминать глупые, но возможные (читай: глупые) подходы, так как это легион.Уничтожение данных является серьезным преступлением при обработке данных и должно рассматриваться как таковое.
Обратите внимание, что я предполагаю, что под символом Unicode вы на самом деле имеете в виду «кодовая точка Unicode»;то есть видимый программисту персонаж.Для символов, видимых пользователю, вместо этого вам понадобится графема Unicode (кластер).
Кроме того, если вы сначала не нормализуете свой текст, вы будете ненавидеть мир.Я предлагаю НФД.
РЕДАКТИРОВАТЬ
После дальнейшего разъяснения оригинальным постером кажется, что то, что он хочет сделать, очень легко сделать с помощью существующих инструментов без написания новой программы.Например, это преобразует определенный набор арабских символов из входного файла UTF-8 в выходной файл ASCII:
$ perl -CSAD -Mutf8 -pe 'tr[ابتثجحخد][abttjhhd]' < input.utf8 > output.ascii
, который обрабатывает только следующие кодовые точки:
U+0627 ا ARABIC LETTER ALEF
U+0628 ب ARABIC LETTER BEH
U+0629 ة ARABIC LETTER TEH MARBUTA
U+062A ت ARABIC LETTER TEH
U+062B ث ARABIC LETTER THEH
U+062C ج ARABIC LETTER JEEM
U+062D ح ARABIC LETTER HAH
U+062E خ ARABIC LETTER KHAH
U+062F د ARABIC LETTER DAL
Таквам придется расширить его до любого отображения, которое вы хотите.
Если вы хотите использовать его в сценарии вместо инструмента командной строки, это также легко, плюс вы можете говорить о символах по имени, задаваядо отображения, такого как:
"\N{ARABIC LETTER ALEF}" => "a",
"\N{ARABIC LETTER BEH}" => "b",
"\N{ARABIC LETTER TEH}" => "t",
"\N{ARABIC LETTER THEH}" => "t",
"\N{ARABIC LETTER JEEM}" => "j",
"\N{ARABIC LETTER HAH}" => "h",
"\N{ARABIC LETTER KHAH}" => "h",
"\N{ARABIC LETTER DAL}" => "d",
Если предполагается, что это компонент в более крупной программе на C ++, то, возможно, вы захотите реализовать это на C ++, возможно, но не обязательно, используя библиотеку ICU4C,которая включает в себя поддержку транслитерации.
Но если все, что вам нужно, это простое преобразование, я не понимаю, почему вы написали бы специальную программу на C ++.Похоже, слишком много работы.