简介:如何cmd使用std::cout流将使用UTF-8编码(Windows CP 65001)存储的源代码中定义的字符串文字正确打印到控制台?
动机:我想修改优秀的Catch单元测试框架(作为实验),以便它显示带有重音字符的文本.修改应该简单,可靠,并且对其他语言和工作环境也应该有用,以便作者可以接受它作为增强.或者,如果你知道Catch,如果有其他替代解决方案,你可以发布吗?
细节:让我们从捷克版的"快速棕色狐狸......"开始吧
#include <iostream>
#include "windows.h"
using namespace std;
int main()
{
cout << "\n-------------------------- default cmd encoding = 852 -------------------\n";
cout << "P?íšern? žlu?ou?ký k?? úp?l ?ábelské ódy!" << endl;
cout << "\n-------- Windows Central European (1250) set for the cmd console --------\n";
SetConsoleOutputCP(1250);
std::cout << "P?íšern? žlu?ou?ký k?? úp?l ?ábelské ódy!" << std::endl;
cout << "\n------------- Windows UTF-8 (65001) set for the cmd console …Run Code Online (Sandbox Code Playgroud) 我正在尝试更新一些"遗留"代码,以符合MSVC的最新安全更新,并且我正面临着迁移_vsnprintf到的一些问题_vsnprintf_s.
特别是,我_vsnprintf使用空缓冲区调用,为计数/长度调用零,获取结果,分配所需大小的缓冲区(return value + 1),然后_vsnprintf使用新分配的缓冲区和已知正确的大小再次调用:
size_t length = _vsntprintf(nullptr, 0, mask, params);
TCHAR *final = new TCHAR [length + 1];
_vsntprintf(final, length + 1, mask, params);
Run Code Online (Sandbox Code Playgroud)
如果count指定的缓冲区大小不足以包含format和argptr指定的输出,则vsnprintf的返回值是count(如果count足够大)将写入的字符数.如果返回值大于count-1,则输出已被截断.
我正在尝试做同样的事情_vsnprintf_s,但它的文档不包含相同的内容.相反,它说
如果存储数据和终止空值所需的存储超过sizeOfBuffer,则调用无效参数处理程序,如参数验证中所述,除非count为_TRUNCATE,在这种情况下,将写入适合缓冲区的字符串,并且 - 1回来了.
无论如何都要尝试以下内容:
size_t length = _vsntprintf_s(nullptr, 0, 0, mask, params);
Run Code Online (Sandbox Code Playgroud)
这导致"长度"为零.如果您传入_TRUNCATE(-1)作为计数,则以下断言失败:
表达式:buffer!= nullptr && buffer_count> 0
我认为可以覆盖_set_invalid_parameter_handler并以某种方式找出长度应该是多少,但是必须有一种更简单的方法吗?
如果我在我的机器上只安装Visual C++ 2017 Redistributable,它是否可以支持为2015年编写的应用程序
换句话说,如果我卸载Visual C++ 2015 Redistributable并安装Visual C++ 2017 Redistributable,那么所有应用程序都可以正常运行吗?
c++ redistributable vcredist visual-c++-2015 visual-c++-2017
这个帖子: Visual-C++ - 2017二进制兼容VC++ - 2015?清楚地说,VS 2017与VS 2015是二进制兼容的.它甚至看起来像官方立场.
我的问题是,在过去,我清楚地记得每当我尝试将使用不同版本的MSVC编译的静态库链接到EXE中时,遇到链接器错误(我不记得具体的错误集)使用较新版本的MSVC构建.
然而,二进制(in)兼容性听起来像是在运行时会在你脸上爆炸的东西,而不是链接时间.
有人能告诉我,以前版本的MSVC是否确实生成了版本不匹配的链接器错误?这是如何完成的?
这如何影响打开WPO/LTCG时构建的静态库?我相信这些产生了中间目标文件(而不是COFF),并且Microsoft不保证这些中间文件的格式在不同版本的编译器中保持停滞.
我想以这种方式格式化我的 C++ 转换运算符:
Class * foo = static_cast< Class * >( bar );
Run Code Online (Sandbox Code Playgroud)
Visual Studio 坚持删除尖括号内的空格:
Class * foo = static_cast<Class*>( bar );
Run Code Online (Sandbox Code Playgroud)
我如何防止它这样做?
我以前尝试过,但在完整版本中几乎没有成功,但即使现在失败了,而且我显然在 Windows 上遗漏了一些东西(是的,它可能是 Windows :P)
有人可以带我过去吗
我正在使用 CMake gui For windows,尝试构建一个 VC2015 项目
我在构建 libgit2 时遇到的错误是
checking for module 'libssh2'
package 'libssh2' not found
LIBSSH2 not found. Set CMAKE_PREFIX_PATH if it is installed outside of the default search path.
Run Code Online (Sandbox Code Playgroud)
即使我已经把它放在每一个可能的地方,我认为它会看起来,我试过设置CMAKE_PREFIX_PATH?
如果有人在 Windows 上成功完成了它,我将不胜感激一两个关于我做错了什么或应该做什么的指针
谢谢罗伯特
我试图直接将浮点数转换为无符号整数,没有任何隐式转换数,(所以不是C风格或静态转换)只是将字节直接复制到另一个.在Windows Visual Studio 2015中,float和无符号整数的大小是相同的(4字节),所以我认为在这方面没有任何问题...我提出了一个解决方案,但必须有一个更好的方法来做我想要的.
unsigned int x = 3;
float y = 2.4565;
*reinterpret_cast<float*>(&x) = y;
Run Code Online (Sandbox Code Playgroud)
这就是我想要的,并将X设置为1075656524.
如果有的话,我更喜欢跨平台的解决方案.我知道类型的大小可能因平台而异,所以这可能是不可能的.
编辑:为了澄清,我希望浮动的所有字节都复制到unsigned int不变.存储在float中的每个位都应存储在无符号整数中.还有一个不使用memcpy的解决方案吗?我想避免使用已弃用的函数.
似乎没有任何反对它的规则,以及我得到的错误
std::vector< std::array<int,8> > output;
output.resize (8);
Run Code Online (Sandbox Code Playgroud)
是 C2036 'std::array<int,0x08> *': unknown size
这没有意义.内部的代码<vector>是推进内部end指针,也在其他地方使用(也就是扩展的计算大小).a的大小struct{int x[8];}肯定是"已知的".
这里发生了什么?
嗯,因为它不仅仅是一个简单的拼写错误或者某些东西,并且在其他人尝试它时似乎工作正常(并且其他人写的样本为我工作!)我减少了源文件,直到没有剩下任何东西,但是令人讨厌的陈述,它仍然失败.这是整个文件.预编译的标头已关闭.
//#include <SDKDDKVer.h>
#include <vector>
int main()
{
std::vector< std::array<int,8> > output;
output.resize (16);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用x64构建,发布版本.
这不是一个缺少的#include vector,但是对于array!它显然是在其他标题中向前声明但是不完整.