如何安全,便便输入并检查重音字符

How to safely and portably input and check for accent characters

本文关键字:输入 检查 字符 何安全 安全      更新时间:2023-10-16

读取某些用户输入的推荐方法是什么,这些用户输入具有特殊字符,例如重音,如果不知道哪个 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_twcin.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;

有关更多上下文查看本文