我正在寻找一种将awstring
转换为string
仅包含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,可能包含特殊字符。我的应用程序的一部分使用了用C编写的仅能理解ASCII的库。因此,我需要一种将文本“哑化”为ASCII而不丢失太多信息的方法。
关于精确的要求:任何作为变体形式的ASCII字符的字符都应转换为该ASCII字符;其他所有字符均应省略。因此ı
,ĩ
和î
应该成为,i
因为它们都是小写拉丁字母i的所有版本。ɩ
另一方面,字符(iota)虽然外观上相似,但不是小拉丁字母i的版本,因此应省略。
在GitHub上有unidecode-cxx,它是node-unidecode的C ++端口(未完成),而后者又是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的情况下进行编译(这是我从未使用过的,并且现在还没有时间弄清楚),我不得不对代码进行一些修改(快速又肮脏):
添加#include <iostream>
到src/unidecode.cxx
,并添加以下main
例程:
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;
}
替换所有提到的NULL
在src/data.cxx
与nullptr
然后我用
g++ -std=c++11 -o unidecode unidecode.cxx
获得预期的结果。
该代码看起来像是一个相当原始的端口,并且可以进行一些改进,尤其是在更“合适”的C ++中。它在内部使用静态编译的转换表,如果不这样做,则可以对其进行调整以满足您的需求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句