【发布时间】:2018-04-26 23:52:27
【问题描述】:
我一直在尝试为一个项目编写 C++ 应用程序,但遇到了这个问题。基本上:
class OBSClass
{
public:
wstring ClassName;
uint8_t Credit;
uint8_t Level;
OBSClass() : ClassName(), Credit(), Level() {}
OBSClass(wstring name, uint8_t credit, uint8_t hyear)
: ClassName(name), Credit(credit), Level(hyear)
{}
};
在其他文件中:
vector<OBSClass> AllClasses;
...
AllClasses.push_back(OBSClass(L"Bilişim Sistemleri Mühendisliğine Giriş", 3, 1));
AllClasses.push_back(OBSClass(L"İş Sağlığı ve Güvenliği", 3, 1));
AllClasses.push_back(OBSClass(L"Türk Dili 1", 2, 1));
... (rest omitted, some of entries have non-ASCII characters like 'ş' and 'İ')
我有一个函数基本上输出AllClasses中的所有内容,问题是wcout没有按要求输出。
void PrintClasses()
{
for (size_t i = 0; i < AllClasses.size(); i++)
{
wcout << "Class: " << AllClasses[i].ClassName << "\n";
}
}
输出是“类:Bili”,没有别的。程序甚至不尝试输出其他条目而只是挂起。我在使用 G++ 6.3.0 的 Windows 上。而且我没有使用 Windows 的 cmd,我使用的是 mingw 的 bash,所以编码不会有问题(或者不是吗?)。有什么建议吗?
编辑:源代码编码也没有问题,只是检查了它是UTF8,VSCode的默认值
编辑:也只是检查了字符串文字是否有问题。
wstring test;
wcin >> test;
wcout << test;
输入了一些非 ASCII 字符,如 'ö' 和 'ş',效果很好。宽字符串字面量有什么问题?
编辑:给你
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<wstring> testvec;
int main()
{
testvec.push_back(L"Bilişim Sistemleri Mühendisliğine Giriş");
testvec.push_back(L"ıiÖöUuÜü");
testvec.push_back(L"☺☻♥♦♣♠•◘○");
for (size_t i = 0; i < testvec.size(); i++)
wcout << testvec[i] << "\n";
return 0;
}
用 G++ 编译: g++ 文件.cc -O3
此代码仅输出“Bili”。一定是 g++ 搞砸了二进制编码(?),因为用wcin 输入值然后用wcout 输出它们不会产生任何问题。
【问题讨论】:
-
您是否记得以 UTF-8 或 UTF-16 等 Unicode 格式保存您的源代码文件,特别是具有 Unicode 字符串文字的源代码文件?
-
是的。我正在使用 VSCode,它的默认编码为 UTF8,刚刚检查过
-
如果问题在于字符串的输出,为什么所有这些代码都带有向量和类来显示问题?只需 1 行
main函数,只需std::wcout << L"Your string";。 -
因为'
main函数'有效 -
如何在一个函数 (
main) 中输出您遇到问题的字符串,然后在输出相同字符时在另一个函数中失败?听起来你有一个错误,而不是一般输出字符串的问题。发布minimal reproducible example,因为发布所有这些代码而不是简单的 1 或 2 行程序会让人怀疑错误与编码无关。
标签: c++ windows utf-8 iostream widestring