读取某些用户输入的推荐方法是什么,这些用户输入具有特殊字符,例如重音,如果不知道哪个 locale
是输入的。
如果我需要以某种方式处理该用户输入的字符,如何安全地比较此用户的字符?
这是一个示例代码来说明意图:
#include <iostream>
using namespace std;
int main() {
char txt[10];
cin.getline(txt, sizeof(txt));
if(txt[0] == 'á')
cout << "Special character foundn";
}
问题是:
warning: multi-character character constant [-Wmultichar]
if(txt[0] == 'á')
^
如果我使用 L'á'
作为宽字符文字,则它将不匹配,因为输入不宽。
如果我也使用 wchar_t
和 wcin.getline
以获取宽字符的用户输入,那么它可能会在某些系统上工作,而在其他系统上可能无法在其他系统上使用,具体取决于环境和语言环境设置。
如何安全地解决这个问题?谢谢!
如果你们俩都不知道自己的语言环境并且必须使解决方案便携式,那么我恐怕没有标准的C 解决方案。而且我不确定它是否会考虑使用UTF-16的Windows。因此,如果您需要"离式解决方案",则检查Nathanoliver评论中提到的库可能是有意义的。
说过,尽管Unicode的支持仍然是C 的痛点(而且令人遗憾的是,我在2017年写下了这些单词(,但C 11都会有所改进。p>因此,如果手动转换是您的一种选择,则可以从其中一些好处中获利。
例如,这是有效的C 11代码。
unsigned char euroUTF8[] = { 0xE2, 0x82, 0xAC, 0x00 }; // Euro sign UTF8
wstring_convert<codecvt_utf8<wchar_t>> converter_UTF8_wchar;
wstring euroWideStr = converter_UTF8_wchar.from_bytes((char*)euroUTF8);
wcout << euroWideStr << endl;
string euroNarrowStr = converter_UTF8_wchar.to_bytes(euroWideStr);
cout << euroNarrowStr << endl;
有关更多上下文查看本文