【问题标题】:Accepting extended ASCII codes as input in C++接受扩展的 ASCII 代码作为 C++ 中的输入
【发布时间】:2016-03-10 19:58:12
【问题描述】:

我的程序不接受诸如“à”之类的符号,因为世界上某些城市名​​称将这些符号作为字符。我正在使用 C++。我已经尝试过各种类型的输入流,例如 getline(cin,string)、fgets 等。所有这些收集输入的形式见“...”处的特殊符号。

这是在 Visual Studio 2015 中制作的 Windows 控制台应用程序

例如

string funnyChar = "à";
getline(cin, checkFunny);
if (checkFunny.compare(funnyChar) == 0)
//do things

用户输入 àero

ALT+0224ero

或用户输入àero as

ALT+133ero

在代码中,输入流无法看到输入的 alt 代码,因此,在我的 if 语句中

if(checkFunny.compare(funnyChar)==0)

永远不会工作。

或多或少,我需要能够接收这些(任何)特殊字符,以便我可以保存它们,然后稍后显示它们,但也不接受非常具体的字符,例如 † (alt+0134)

【问题讨论】:

  • 也许你需要wstringwcin
  • 我不确定什么是扩展 ASCII 码(>127?),也许你需要 utf?
  • 可接受的内容由您的std::locale 设置决定。
  • 您以哪种格式存储源代码?哪个编辑器?

标签: c++ ascii iostream


【解决方案1】:

C++ 通常不会对源代码中的扩展字符进行编码(通常是 ASCII、UTF-7)。试试

string funnyChar = "\x85";

它应该开始以您期望的方式工作。

【讨论】:

  • 这不起作用,因为当我从用户那里获得输入时,它采用 int "..." 而不是 "à" 因此我什至无法比较。但是,在视觉工作室中,funnyChar 实际上是 à。当用户输入 à 时,checkFunny 变为“...”。因此比较不起作用..
  • 我可以使用 ALT+133 在提示行上输入扩展 ascii 字符,但编译后的代码不包含正确的字符。它使用不同的字体,而不是 133(默认控制台字体中的正确字符),它在代码中将其编码为 224(大多数 TrueType 字体中的正确字符)。我假设您也发生了同样的情况,可能使用了不同的字体,但是您使用的任何内容都与您运行它的控制台不匹配。确保您在两个地方都使用了正确的值,因为它们不是标准化的。
  • 是的,当我自己测试它时,我可以看到你在说什么。我的另一个问题是我想存储输入的 ALT+133 代码,但是当使用 cin
  • ALT+133 和 ALT+224 都打印 ... 在输入提示上?你能通过 cout'ing (int)(checkFunny[0]) 得到字符串中存储的内容的 ASCII 码吗?这可能说明这是否是输入控制台问题?
【解决方案2】:

如果您尝试在程序的参数列表中使用这些字符,那是不可能的。 main 必须声明为 main(void)'、'main(int argc, char **argv)' 或语义等价物。我相信你需要像'main(int argc,wchar_t **argv)'这样的东西,这是标准不允许的。

如果您只是想在其他地方获取数据后对其进行处理,我会建议您尝试这些函数的宽字符版本。例如 fgetwc。可能是这样的。

#include <iostream>
#include <string>
int main() {
  std::locale loc("");
  std::locale::global (loc);
  wcin.imbue(loc);
  std::wstring city;
  std::wcout << L"Enter your city: ";
  std::wcin >> city;
  std::wcout << L"What's it like in " << city << "?\n";
}

http://www.cplusplus.com/reference/cwchar/

【讨论】:

  • 这些不是参数输入,它们是来自用户的输入。例如,如果用户说城市是“àero”(组成城市),那么用户将输入(在命令提示符中)“ALT+0224 (for "à")ero”
  • 你试过宽字符版本吗?像 wcin、wcout?例如。 #include #include int main() { std::wstring city; std::wcout > 城市; std::wcout
  • 还有一点,如果你使用这样的东西,不要混合使用 wcin 和 cin,或者 wcout 和 cout。 cplusplus.com/reference/iostream/wcout
  • 好的,试试看。完全公开,这有点巫毒编程。我以前没有研究过语言环境。
  • Windows 有 wmain,它是主要的 wchar_t **argv。 (msdn.microsoft.com/en-us/library/bky3b5dh.aspx)
【解决方案3】:

stdinstdout 模式设置为U16 即可。检查以下代码。 (注意设置stdout只有当你想再次输出相同的字符时才需要。)

#include <iostream>
#include <string>
#include <io.h>
#include <fcntl.h>

int main()
{
    _setmode(_fileno(stdin), _O_U16TEXT);
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wstring funnyChar(L"à");
    std::wstring checkFunny;
    std::wcin >> checkFunny;
    if (checkFunny.compare(funnyChar) == 0)
        std::wcout << L"Yay" << std::endl;
    std::wcout << checkFunny << std::endl;
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    • 2016-06-23
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多