我在Linux Mint 15中使用gcc,并且我的终端可以理解unicode。我将处理UTF-8。我正在尝试获取更复杂的unicode字符串的基本单词。有点像将“ alternative”一词修剪为“ alternat”,但使用的是另一种语言。因此,我将需要测试每个单词的结尾。

在c和ASCII中,我可以做这样的事情

if(string[last_char]=='e')
    last_char-=1; //Throws away the last character


我可以对unicode做类似的事情吗?就是这样的:

if(string[last_char]=='ഒ')
    last_char=-1

最佳答案

编辑:
很抱歉,@ chux说我刚刚通知您正在用C进行询问。无论如何,同样的原则仍然适用。

在C语言中,您可以使用wscanfwprintf对宽字符字符串进行I / O。如果您的角色在BMP中,则可以。只需将char *替换为wchar_t *并照常执行所有操作即可。

为了进行认真的开发,我建议将所有字符串转换为char32_t进行处理。或使用ICU之类的库。

如果只需要删除字符串中的某些给定字符,则可能不需要复杂的Unicode字符处理。将您的Unicode字符视为原始的char *字符串,并对其执行任何字符串操作。

下面转载了面向C ++的旧答案,以供参考。



简单的方法

使用std::wstring

它基本上是一个std::string,但各个字符都键入wchar_t

对于IO,您应该使用std::wcinstd::wcout。例如:

std::wstring str;
std::wcin >> str;
std::wcout << str << std::endl;


但是,在某些平台中,wchar_t是2字节宽,这意味着BMP之外的字符将不起作用。我认为这对您来说应该可以,但不应在认真的开发中使用。有关此主题的更多文本,请阅读this

艰难的道路

使用更好的Unicode感知字符串处理库,例如ICU

C ++ 11方式

使用一些机制将输入字符串转换为std::u32string即可完成。转换例程可以手工制作,也可以使用现有的库(例如ICU)。

由于std::u32string是使用char32_t形成的,因此可以放心地假设您正在正确处理Unicode。

10-06 10:22
查看更多