_wsopen_s с флагом _O_U8TEXT, возвращает 0 в буфер, между символами и 4 между русскими символами. VS2010 - PullRequest
1 голос
/ 22 мая 2011

Если я введу файл в кодировке 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 '<', buf [1] = 0, buf [2] = 104 'h', buf [3] = 0 и т. Д. </p>

, пока я не достигнурусские буквы, затем я получаю совершенно неподходящие символы, такие как 20 '', за которыми следуют 4 '',

'char' - это вывод vstudio этого символа .. странно то же самое для 20 и 4.

Итак, вопрос в том, можно ли каким-либо образом получить буфер вывода в строку до EOF, отформатированный правильно, даже если этот оператор не используется?

1 Ответ

0 голосов
/ 22 мая 2011

Похоже, _O_U8TEXT заставляет _read конвертировать из UTF-8 в UTF-16.Вам, вероятно, следует читать с использованием высокоуровневых функций Юникода, таких как getwc, при открытии потока в режиме Юникода.Вы можете использовать _wfopen_s с L"rt, ccs=UTF-8" или, если вам нужна поддержка совместного использования, вы можете использовать свой существующий вызов _wsopen_s, за которым следует _wfdopen.

...