我试图打印文本“Ääkkösiäruutuun。”用C ++到控制台。我有Windows 7和正在使用的代码::块编辑器。搜索关于这个问题,我发现,也许这些类型的线,将有助于
_setmode(_fileno(stdout), _O_U16TEXT);
wstring s{L"Ääkkösiä ruutuun."};
wcout<<s<<endl;
但是,当我尝试编译它,我得到的错误:_fileno没有在这个范围内声明。
我有所有这些包括:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <stdexcept>
#include <cmath>
#include <sstream>
#include <fstream>
#include <codecvt>
#include <locale>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <cstdio>
#include <ostream>
我缺少什么?
另外,我想另一件事是语言环境,但随后区域设置::空没有被发现!为什么我的C ++有它什么?
编辑这里是什么我的程序现在正在做的图片。
它打印出只是第一个字母(A)。发生了什么休息?
好吧,这似乎setmode设置,这样只有一个字母被打印出来。 (即便要打印与多个命令正常文本,只是导致一个字母)。如果没有它的斯堪的纳维亚字母打印不正确,思想。他们是这样的:
你找到了答案是Visual Studio中,没有代码::块。
而C标准规定又该在<stdio.h>
,它只规定了最低限度。实现者可以添加自己的职能,而且应该这样做使用_
(下划线前缀)。这就是为什么你不应该使用前缀。你不知道你会打破什么。微软使用正确的前缀清楚地表明他们的非标准扩展。
答案被标记C ++,但C ++从C.继承<stdio.h>
的内容
该生产线
setlocale(LC_CTYPE, ".OCP");
作品!
一个完整的例子:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <fstream>
using namespace std;
wstring readFile(const char* filename) {
wifstream wif(filename);
locale myLoc("");
//locale utf8_locale(locale(), new gel::stdx::utf8cvt<true>);
wif.imbue(myLoc);
basic_stringstream<wchar_t> wss;
wss << wif.rdbuf();
return wss.str();
}
int main() {
setlocale(LC_CTYPE, ".OCP");
wstring contents = readFile("test.txt");
wcout<<L"Does anything get printed out at all???"<<endl;
//wcout <<contents<<endl;
wstring s{L"Ääkkösiä ruutuun."};
wcout<<s<<endl;
wcout<<L"Näkyykö äkköset?"<<endl;
return 0;
}
从文件(UTF-8)的文本内容仍不能正常打印,虽然。它应该是
您好! 在这里,有两条线。
A的出差错那里。
输出: