按照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);
}
由于某种原因,我得到以下输出:
⤱㨠攠牲牯䌠ㄲ›瘣牥楳湯㌠〰洠獵⁴敢映汯潬敷祢攠ੳ⠰⤲㨠攠牲牯䌠㈰›湵畳灰牯整敶獲潩〳ਰ⠰⤲㨠攠牲牯䌠〰〰›祳瑮硡攠牲牯湵硥数瑣摥✠✨硥数瑣湩㨢∺愠⁴潴敫⠢ਢ⠰⤴㨠攠牲牯䌠㔷㈳
有人可以告诉我为什么我得到这个损坏的输出吗?
感谢所有帮助。
答案 0 :(得分:2)
您没有使用char
将wchar_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