我们在Team Foundation Server(TFS)中有一个项目,其中包含非英语字符(š).当我试图编写一些与构建相关的东西时,我们偶然发现了一个问题 - 我们无法将š字母传递给命令行工具.命令提示符或其他什么不是搞砸了,并且tf.exe实用程序找不到指定的项目.
我已经尝试了.bat文件的不同格式(ANSI,带有和不带BOM的 UTF-8 )以及用JavaScript编写脚本(这本身就是Unicode) - 但没有运气.如何执行程序并将其传递给Unicode命令行?
当我在Windows中打开cmd.exe时,它使用的是什么编码?
如何查看当前使用的编码?它取决于我的区域设置还是有任何环境变量需要检查?
键入具有特定编码的文件时会发生什么?有时我会收到乱码(使用的编码不正确),有时候它会有所作为.但是,只要我不知道发生了什么,我就不相信任何事情.谁能解释一下?
如何wstring在Windows平台上读取(UTF-8)文件?
我正在阅读"C++ Cookbook",其中包含以下代码段:
// cout << s << std::endl; // You shouldn't be able to
wcout << ws << std::endl; // run these at the same time
Run Code Online (Sandbox Code Playgroud)
如果您对查看实际示例感兴趣,可以在此处找到Google图书页面的链接.
此外,我发现这个SO问题似乎表明混合wcout和cout是可以的.有人可以向我解释一下这个评论的内容吗?
编辑
从C++标准[27.4.1]:
对相应的宽字符和窄字符流的混合操作遵循与在FILE上混合此类操作相同的语义,如ISO C标准的修订1中所规定的.
从C标准[7.19.2]:
每个流都有一个方向.在流与外部文件关联之后,但在对其执行任何操作之前,该流没有方向.一旦将宽字符输入/输出功能应用于没有方向的流,该流就变为面向广泛的流.类似地,一旦将字节输入/输出功能应用于没有方向的流,该流就变成面向字节的流.只有调用freopen函数或fwide函数才能改变流的方向.(成功拨打freopen会删除任何方向.)
字节输入/输出功能不应用于面向广泛的流,宽字符输入/输出功能不应用于面向字节的流.
所以,标准似乎说你不应该混合它们.但是,我从这篇文章中找到了这句话:
对于Visual C++ 10.0,fwide函数被记录为未实现.从实际的角度来看,至少在输出整行的水平上,它显然可以很好地混合使用cout和wcout.因此,很高兴,Visual C++显然只是忽视了标准的要求,并没有维护一个不切实际的显式C FILE流方向.
而且,关于gcc,我从这里找到了这个引用:
这是一个(新的)功能,而不是一个bug,请参阅libstdc ++/11705,以及在C标准(C99,7.19)中的流方向搜索.简而言之,您不能混合面向字节和面向广泛的I/O. 目前,由于 libstdc ++/11705中指出的bug,你可以通过调用std :: ios :: sync_with_stdio(false)获得接近你期望的东西.在你的程序的开头.
我还在学习C++,所以忍受我和我的草率代码.我使用的编译器是Dev C++.我希望能够使用cout将Unicode字符输出到控制台.当我尝试这样的事情时:
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
std::cout << "Blah blah blah some gibberish unicode: ??ß??\n";
system("PAUSE");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它会向控制台输出奇怪的字符,例如μA■Gg.为什么会这样做,我怎样才能展示ĐĄßĞĝ?或者Windows无法实现这一点?
无法绕过这一个是一个真正的耻辱源...
我在法语Windows(XP)中使用法语版的Visual Studio(2008).发送到输出窗口的字符串中的法语重音被破坏.从输出窗口输入Ditto .典型的字符编码问题,我输入ANSI,得到UTF-8作为回报,或者那样的东西.在向输出窗口显示"硬编码"字符串时,什么设置可以确保字符保留在ANSI中?
编辑:
例:
#include <iostream>
int main()
{
std:: cout << "àéêù" << std:: endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
将在输出中显示:
奥羽
(此处编码为HTML以供您观看乐趣)
我真的很想表明:
àéêù
我花了一整天的时间试图弄明白这一点,没有运气.我看着Everywhere,但工作代码没有运气.
操作系统:Win XP Sp2 IDE和FRAMEWORK:C++,Qt Creator 2.0.
我试图输出一些unicode(UTF-8)文本到Windows控制台,但我看到的只是乱码代替unicode字符.我知道win控制台确实支持unicode(自2000年以来)......至少根据维基百科和网上很多人的说法,我不知道如何让它与Qt一起工作.我见过的大多数"解决方案"(没有见过很多)使用C++和WInAPI技术......我不能使用它,因为这不是Qt方式.我正在使用QStrings和Qt!
代码如下.我拿出了所有不同的东西,我试图保持代码简单的帖子.希望有人可以让代码工作.
#include <QtCore/QCoreApplication>
#include <QString>
#include <QTextStream>
#include <QDate>
#include <QFile>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QTextStream qin(stdin);
QTextStream qout(stdout);
//The last 2 chars in QString each need a double slash for an accent.
QString szqLine = QString::fromUtf8("abc áéüóöú ??");
//I want this text console output to be in red text color.
qout << "Bellow are some unicode characters: " << endl;
//The Win XP …Run Code Online (Sandbox Code Playgroud) 所以我现在正在学习C++ 11,而且我已经掌握了它.我想使用不同的语言,因为我是越南语,我想制作一个使用越南字符的C++程序.
那么如何以与显示英语相同的方式显示越南语字符,如下所示:
cout << "Hello. This is English" << endl; //English
cout << "Chào. ?ây là ti?ng Vi?t." << endl; //Vietnamese
Run Code Online (Sandbox Code Playgroud)
我听说C++有<locale>.它有助于使越南人物出现吗?
如何更改C++ Windows控制台应用程序中的字体?
它似乎没有使用默认情况下cmd.exe使用的字体(Lucida Console).当我通过现有的cmd.exe(输入name.exe)运行我的应用程序时,它看起来像这样:http://dathui.mine.nu/konsol3.png这是非常正确的.但是,当我单独运行我的应用程序(双击.exe)时,它看起来像这样:http://dathui.mine.nu/konsol2.png.相同的代码,两个不同的外观.
所以现在我想知道如何更改字体,使其无论运行方式如何都始终正确.
编辑:
好的,还有一些信息.当我只使用这个小片段时:
SetConsoleOutputCP(CP_UTF8);
wchar_t s[] = L"èéøÞ????æ?a";
int bufferSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL);
char* m = new char[bufferSize];
WideCharToMultiByte(CP_UTF8, 0, s, -1, m, bufferSize, NULL, NULL);
wprintf(L"%S", m);
Run Code Online (Sandbox Code Playgroud)
它使用正确的字体.但在我的实际应用程序中,我WriteConsoleOutput()用来打印字符串:
CHAR_INFO* info = new CHAR_INFO[mWidth * mHeight];
for(unsigned int a = 0; a < mWidth*mHeight; ++a) {
info[a].Char.UnicodeChar = mWorld.getSymbol(mWorldX + (a % mWidth), mWorldY + (a / mWidth));
info[a].Attributes = mWorld.getColour(mWorldX + …Run Code Online (Sandbox Code Playgroud) 我想用wcout显示混有中文的阿拉伯语消息.
以下代码没问题:
#include <iostream>
using namespace std;
int main()
{
wcout.imbue(locale("chs"));
wcout << L"??"; // OK
}
Run Code Online (Sandbox Code Playgroud)
但是,以下代码不起作用:
#include <iostream>
using namespace std;
int main()
{
wcout.imbue(locale(/* What to place here ??? */));
wcout << L"???????????? ?????????????"; // Output nothing. VC++ 2012 on Win7 x64
// Why does the main advantage of unicode not apply here?
}
Run Code Online (Sandbox Code Playgroud)
我认为在采用unicode之后应该弃用代码页的概念.
Q1.wout显示这样一个文本的机制是什么?
Q2.为什么Windows作为基于unicode的操作系统不支持在其控制台窗口中输出unicode字符?