使用wprintf

时间:2018-06-30 18:11:53

标签: c++ opengl glsl lpwstr

按照opengl-tutorial.org的教程进行操作 ,意识到我无法直接使用printf打印着色器编译日志,因为我是在Windows桌面应用程序中执行此操作的。我尝试使用此方法将其转换为LPWSTR:

//compile the shader
glShaderSource(fShader, 1, &pFsCode, NULL);
glCompileShader(fShader);

//check shader compilation
glGetShaderiv(fShader, GL_COMPILE_STATUS, &result);
glGetShaderiv(fShader, GL_INFO_LOG_LENGTH, &logLen);
if (logLen > 0) {
    //get compile log
    vector<char> fErr(logLen + 1);
    glGetShaderInfoLog(fShader, logLen, NULL, &fErr[0]);

    //try to convert log to LPWSTR
    wchar_t msg[100];
    swprintf(msg, sizeof(msg) / sizeof(*msg), L"%s\n", &fErr[0]);

    //print it
    wprintf(msg);
}

由于某种原因,我得到以下输出:

⤱㨠攠牲牯䌠㄰ㄲ›瘣牥楳湯㌠〰洠獵⁴敢映汯潬敷⁤祢攠ੳ⠰⤲㨠攠牲牯䌠㈰㄰›湵畳灰牯整⁤敶獲潩〳ਰ⠰⤲㨠攠牲牯䌠〰〰›祳瑮硡攠牲牯‬湵硥数瑣摥✠✨‬硥数瑣湩⁧㨢∺愠⁴潴敫⠢ਢ⠰⤴㨠攠牲牯䌠㔷㈳

有人可以告诉我为什么我得到这个损坏的输出吗?

感谢所有帮助。

2 个答案:

答案 0 :(得分:2)

您没有使用charwchar_t转换为swprintf(..., "%s\n", ...),因为根据https://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx %s的含义如下:

  

与printf函数一起使用时,指定单字节或多字节字符串;与wprintf函数一起使用时,指定宽字符字符串。字符显示直到第一个空字符或直到达到精度值为止。

由于您确实在这里使用*wprintf函数,%s已经期望使用宽字符串,但是您给了它一个非宽字符串。因此,ASCII文本(在这种情况下为1) : error C0121: #version 300 must be followed by ...)将被解释为宽字符串,从而导致垃圾邮件。

根据同一网页,%S可能是解决您问题的最快解决方案(“与wprintf函数一起使用时,指定单字节或多字节字符串” – {{1} }用于普通的printf)。

答案 1 :(得分:0)

正如@genpfault在他的SO answer中解释的那样,OpenGL规范谈到了upstream django { server 127.0.0.1:8001; } server { listen 8000; server_name taopinpin.cn; root /root/mysite; # you should really use a standard location, like /var/www charset utf-8; client_max_body_size 75M; location / { try_files $uri $uri/ @proxy; } location @proxy { inlcude /root/mysite/mysite/uwsgi_params; # is this correct? Mine is in /etc/nginx uwsgi_pass django; } } 返回UFT-8字符串的命令。关于*GetString并没有说什么,但是看起来它还返回一个UTF-8编码的字符串似乎很合理。

即使是ASCII码,转换为UTF-8时也将是相同的,因为UTF-8的前127个代码与ASCII码相同。

您最好的选择是打印UTF-8字符串,如果可以的话,在C ++中无需任何转换即可。但是直到今天,它还没有在内部使用UFT-16的Windows中或在Linux及其UTF-32的使用中。

要进行转换,请使用std::codecvt。有关示例,请参见this SO question