如何将宽字符串转换为ASCII码

3
我正在寻找一种将转换为仅包含ASCII字符的普通的方法。任何不在ASCII(0-127)中出现的字符都应该转换为最接近的ASCII字符。如果没有类似的ASCII字符,则应省略该字符。
举个例子,假设有以下宽字符串:
wstring text(L"A naïve man called 晨 was having piña colada and crème brûlée.");

我需要翻译的内容是:

我要找的转换后的版本是这样的(请注意没有重音符号):

string("A naive man called  was having pina colada and creme brulee.")

编辑:

关于目的:我正在编写一款分析英语文本的应用程序。输入文件为UTF-8格式,可能包含特殊字符。我的应用程序的一部分使用了一个只能理解ASCII的C库。因此,我需要一种将文本转换为ASCII的方法,同时不会丢失太多信息。

关于具体要求:任何一个ASCII字符的变音版本都应该被转换为那个ASCII字符;所有其他字符都应该被省略。因此,ıĩî应该变成i,因为它们都是小写拉丁字母i的版本。另一方面,字符ɩ(小写希腊字母iota)虽然在视觉上相似,但不是小写拉丁字母i的版本,因此应该被省略。


1
任何不在ASCII(0-127)中的字符都应转换为最接近的ASCII字符。如果没有类似的ASCII字符,则应省略该字符。这听起来并不是很明确定义。†是否几乎等于t? - Baum mit Augen
2
你只需要定义“相似”和“最接近”的含义。也许是一个巨大的表格? - Bo Persson
为了允许更多可能的解决方案,这与网站的要求相抵触。我们希望提出一个清晰明确、回答范围较窄的问题。我认为当前这个问题范围太广泛了。 - NathanOliver
2
也许有用:https://dev59.com/8HRB5IYBdhLWcg3wxZ7Y - mindriot
1
也许会有用,可以查看C/C++库的背后内容 演示:,选择Accents作为样本,Latin作为Source1,ASCII作为目标... - Anto Jurković
显示剩余4条评论
2个回答

4
在GitHub上,有一个名为unidecode-cxx的项目,它是node-unidecode的C++移植版本(尚未完善),而node-unidecode又是Perl的Text::Unicode的JavaScript移植版本。C++版本还有些不完善,但可以修改src/unidecode.cxx中的示例代码以转换您的示例字符串:

A naïve man called 晨 was having piña colada and crème brûlée.

转换结果如下:

A naive man called Chen was having pina colada and creme brulee.

为了使代码能够在没有Gyp的情况下编译通过(我从未使用过,并且现在也没有时间去弄清楚),我不得不对代码进行一些修改(快速、简单):

  • Add #include <iostream> to src/unidecode.cxx, and add the following main routine:

    int main() {
      string output_buf;
      string input_buf = "A naïve man called 晨 was having piña colada and crème brûlée.";
      unidecode(&input_buf, &output_buf);
      cout << output_buf.c_str() << endl;
    }
    
  • Replace all mentions of NULL in src/data.cxx with nullptr

接着我使用以下指令进行编译:

g++ -std=c++11 -o unidecode unidecode.cxx

为了获得所期望的结果。

这段代码看起来像一个相当原始的端口,并且需要一些改进,特别是转化为更加“正式”的C ++。它在内部使用静态编译的转换表,如果不适用于您的需求,则可能需要进行调整。


0

wstring 是一个由 wchar 组成的 string,其中 wchar 可能具有 2 或 4 个字节的大小。同时,UTF8 是一种可变长度编码,符号大小为 1-4 个字节。因此,您的请求并不完全一致。

假设您已经确定了字符串中数据的存储方式,我建议您查看 ICU 库以进行进一步的转换。

您可以规范化您的字符串,然后删除所有变音符号。但是,您仍将面临希腊语、西里尔语等问题。

或者,您可以使用 transliteration 功能,这更像是您要寻找的东西。

mindriot 的解决方案更加简洁,但仍需要将您的 wstring 转换为适当的 UTF8 序列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接