如何在C ++中比较/替换数组中的非ASCII字符?

时间:2014-07-09 22:52:41

标签: c++ arrays string utf-8 non-ascii-characters

我有一个大字符数组,其中包含捷克变音字符(例如“á”),以UTF-8编码。我需要将它们替换为ASCII等价物(例如“a”),因为程序必须在Windows上运行(Linux控制台完全接受这些字符)。 我正在通过char读取数组char并将内容写入字符串。 这是我正在使用的代码,这不起作用:

int array_size = 50000; //size of file array
char * array = new char[array_size]; //array to store file contents
string ascicontent="";

if ('\u00E1'==array[zacatek]) { //check if char is "á"
                ascicontent +='a'; //write ordinal "a" into string
            }

我甚至尝试用'á'替换'\ u00E1',但它也不起作用。猜测这些字符比ascii更长的问题。

如何声明非ascii字符,以便进行比较?

3 个答案:

答案 0 :(得分:1)

每个char都是一个字节,但UTF-8可以使用多个字节来编码单个字符。特别是U + 00E1被编码为两个字节:0xC3 0xA1。因此,仅仅比较一个char就无法做到你想要的。

您可以通过多种方式解决问题:

A)首先,尝试谷歌搜索“Windows控制台utf-8”,看看是否有任何东西可以使事情正常工作而不必改变角色。 (我不知道是否有什么能适合你,我从来没有尝试过。)

B)使用MultiByteToWideCharmbstowcs将数据转换为宽字符(wchar_t)然后谷歌如何使用wcout等输出UTF-16到控制台。

C)使用MultiByteToWideChar将数据从UTF-8转换为UTF-16。然后使用WideCharToMultiByte将UTF-16转换为控制台的代码页,依赖于它可以自动“最适合”常见字符(例如“á”到“a”)这一事实。

D)如果您真的只关心一组有限的字符(例如捷克语代码页中只有重音字符),那么您可以编写自己的UTF-8字节序列查找表和所需的替换字符。你只需要通过那些多个字节而不是单个字符来对UTF-8进行比较。在各种工具中,我发现this page有助于了解字符如何以各种方式编码。

这些对您的程序最有意义取决于各种因素,例如保持Windows特定部分与特定于Linux或跨平台的部分冲突的容易程度或难度。

答案 1 :(得分:0)

C中的

char不是unicode,它实际上是一个字节;它只会被您碰巧使用的终端控制台转换为字形。在某些Linux实现(如Debian)上,它默认为UTF-8,因此如果您的程序输出以UTF-8编码的字节序列,您的终端将显示正确的字形。如果您知道array是UTF-8编码的,则必须检查正确的字节序列。

修改:查看The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

答案 2 :(得分:-2)

请查看此链接http://en.wikipedia.org/wiki/Wide_character。 我相信这段代码可能对您有所帮助:

std::wstring str(L"cccccááddddddd");
std::replace( str.begin(), str.end(), L'á', L'a');