带有_O_U8TEXT标志的_wsopen_s,返回0到缓冲区,中间字符和俄语字符之间的4。 VS2010

时间:2011-05-22 19:06:59

标签: c++ visual-studio visual-studio-2010 visual-c++-2010

如果我输入UTF-8编码的文件,如

example.html的

<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>Текст на русском</title>

“Текстнарусском” - 俄语文本

#include <string>
#include <ios>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>

using namespace std;
int main () 
{
int fl; unsigned int nbytes = 60000,bspr; char buf [60000];
errno_t err = _wsopen_s(&fl,L"c:\\example.html", _O_U8TEXT,_SH_DENYNO,_S_IREAD | _S_IWRITE ); // &fh,"c:\\example.html",_O_RDONLY, 
if ( err!=0 ) exit (1);
if ((bspr = _read(fl,buf,nbytes))<=0 )
{
    perror (" Error opening file ");
    exit (1);
}

}

我得到buf [0] = 60'&lt;',buf [1] = 0,buf [2] = 104'h',buf [3] = 0,等等

直到我达到俄语字母,然后我得到完全不正确的符号,如20'',然后是4'',

'char' - 是这个角色的vstudio输出。对于20和4来说奇怪的相同。

所以问题是 - 是否有任何方法可以将输出缓冲区输出到字符串直到EOF,格式正确,即使不使用此运算符?

1 个答案:

答案 0 :(得分:0)

看起来_O_U8TEXT会导致_read从UTF-8转换为UTF-16。在unicode模式下打开流时,您可能应该使用高级Unicode函数(如getwc)进行读取。您可以将_wfopen_sL"rt, ccs=UTF-8"一起使用,或者如果您需要共享支持,则可以使用现有的_wsopen_s来电,然后_wfdopen