我正在使用iconv的音译功能将unicode字符串转换为最接近的ASCII等效项。但是,该字符串包含一些不具有ASCII等效项的符号。我想保留这样的符号而不丢弃它们。
当前,这是我在做什么:
iconv_t cd = iconv_open("ASCII//IGNORE//TRANSLIT", "UTF-8");
const char *utf8 = "ç ß ∑ a";
char* in = const_cast<char*>(utf8);
size_t in_bytes = strlen(in);
char buf[BUFSIZ] = {};
char* out = buf;
size_t out_bytes = sizeof(buf);
iconv(cd, &in, &in_bytes, &out, &out_bytes);
printf("%s", buf);
// prints
c ss a
如何配置iconv以产生如下所示的输出:
c ss ∑
如果iconv无法做到这一点,是否可以通过编程方式实现此目的?
iconv
不支持您想开箱即用的转换行为,因为这是一个很奇怪的行为:如果在输出中包含∑是可以的,为什么不可以输出中有ß?
无论如何,您可以通过自己的使用iconv的函数来实现此转换,如下所示:
iconv_t cd0 = iconv_open("UTF-8", "UTF-8");
iconv_t cd1 = iconv_open("ASCII//TRANSLIT", "UTF-8");
cd1
的iconv()来反复转换部分字符串。当调用失败并显示errno == EILSEQ时,您知道这是由于无法将其音译为ASCII字符所致。cd0
的iconv()调用,只能转换一个字符。您可以通过in = 1调用iconv()来执行此操作,然后如果in = 2失败,依此类推,直到in =4。(如果所有这些都失败,则必须输入无效;最好的选择是跳过一个输入字节,并在输出中保留单个“?”。)