这要么是不可能的,要么是微不足道的。以下是简单的方法:
我留下的那些不可能作为原始海报的练习。我什至不会提及愚蠢但可能(读作:愚蠢)的方法,因为这些方法很多。数据破坏是数据处理中的死罪,应该这样对待。
请注意,我假设“Unicode 字符”实际上是指“Unicode 代码点”;也就是说,程序员可见的字符。对于用户可见的字符,您需要 'Unicode grapheme (cluster)' 代替。
此外,除非你先规范化你的文本,否则你会讨厌这个世界。我建议NFD。
编辑
经过原发帖人的进一步澄清,似乎他想做的事情很容易使用现有工具完成,而无需编写新程序。例如,这会将一组阿拉伯字符从 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++ 程序。好像工作量太大了。