我有一个大字符数组,其中包含捷克变音字符(例如“á”),以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字符,以便进行比较?
答案 0 :(得分:1)
每个char
都是一个字节,但UTF-8可以使用多个字节来编码单个字符。特别是U + 00E1被编码为两个字节:0xC3 0xA1。因此,仅仅比较一个char
就无法做到你想要的。
您可以通过多种方式解决问题:
A)首先,尝试谷歌搜索“Windows控制台utf-8”,看看是否有任何东西可以使事情正常工作而不必改变角色。 (我不知道是否有什么能适合你,我从来没有尝试过。)
B)使用MultiByteToWideChar或mbstowcs将数据转换为宽字符(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)
char
不是unicode,它实际上是一个字节;它只会被您碰巧使用的终端控制台转换为字形。在某些Linux实现(如Debian)上,它默认为UTF-8,因此如果您的程序输出以UTF-8编码的字节序列,您的终端将显示正确的字形。如果您知道array
是UTF-8编码的,则必须检查正确的字节序列。
答案 2 :(得分:-2)
请查看此链接http://en.wikipedia.org/wiki/Wide_character。 我相信这段代码可能对您有所帮助:
std::wstring str(L"cccccááddddddd");
std::replace( str.begin(), str.end(), L'á', L'a');