iconv-保留无法转换为ascii的字符

问题描述 投票:0回答:1

我正在使用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无法做到这一点,是否可以通过编程方式实现此目的?

c ascii iconv libiconv
1个回答
0
投票

iconv不支持您想开箱即用的转换行为,因为这是一个很奇怪的行为:如果在输出中包含∑是可以的,为什么不可以输出中有ß?

无论如何,您可以通过自己的使用iconv的函数来实现此转换,如下所示:

  1. 分配两个转换描述符:
    iconv_t cd0 = iconv_open("UTF-8", "UTF-8");
    iconv_t cd1 = iconv_open("ASCII//TRANSLIT", "UTF-8");
    
  2. 使用一个循环,通过带有cd1的iconv()来反复转换部分字符串。当调用失败并显示errno == EILSEQ时,您知道这是由于无法将其音译为ASCII字符所致。
  3. 此时,使用带有cd0的iconv()调用,只能转换一个字符。您可以通过in = 1调用iconv()来执行此操作,然后如果in = 2失败,依此类推,直到in =4。(如果所有这些都失败,则必须输入无效;最好的选择是跳过一个输入字节,并在输出中保留单个“?”。)
  4. 在对单个字符进行无操作转换之后,返回到步骤2。
© www.soinside.com 2019 - 2024. All rights reserved.