Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > проблемы с чтением unicode из файла


Автор: informn 24.7.2005, 17:20
Нужно считать файл(Unicode UTF-16).

Код

#include "stdafx.h"
#include "TChar.h"
#include "iostream"
#include "string"
#include "fstream"
#include "Windows.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    char ch[1000];
    wchar_t    chu[1000];
    wchar_t    chu1[100];
    wifstream inDictFile;
    
    inDictFile.open("test.txt", ios::in);
    int i;
    i=0;
    for (i=0; i< 100; i++)
        {
            inDictFile.getline(chu,900);
            WideCharToMultiByte(1252,0, chu,-1, ch,1000, NULL, NULL);
        }

    return 0;
}



Вот код, ктр. это делает, но возникает такая проблема:
Если просматривать содержимое chu, то через 1 символ содержится 0-символ.
В chu содержится
[0] 255 'ÿ' wchar_t
[1] 254 'þ' wchar_t
[2] 60 '<' wchar_t
[3] 0 wchar_t
[4] 97 'a' wchar_t
[5] 0 wchar_t
[6] 114 'r' wchar_t
[7] 0 wchar_t
[8] 116 't' wchar_t
[9] 0 wchar_t
[10] 105 'i' wchar_t
[11] 0 wchar_t
[12] 99 'c' wchar_t
[13] 0 wchar_t
[14] 108 'l' wchar_t
Откуда берутся символы [0] 255 'ÿ' wchar_t и [1] 254 'þ' wchar_t(их нет в исходном файле)? может быть это признак unicode текста?
вот начало файла:
<article id="1

При преобразовании WideCharToMultiByte он преобразует не всю строку, а только её часть до первого 0. Как убрать эти лишние 0.
Может быть это можно сделать как попроще?

Компилятор visual c++ 7.1


рихтера читал, но там как-то всё мутно и без конкретных нормальных примеров. может быь ещё где стоит почитать?

Автор: Дрон 25.7.2005, 14:04
Цитата(informn @ 24.7.2005, 18:20)
Откуда берутся символы [0] 255 'ÿ' wchar_t и [1] 254 'þ' wchar_t(их нет в исходном файле)? может быть это признак unicode текста?

В общем, да. Кроме того, они обозначают порядок следования старшего/младшего байтов.

Цитата(informn @ 24.7.2005, 18:20)
Если просматривать содержимое chu, то через 1 символ содержится 0-символ.

Так ты по байтам, похоже, просматриваешь. А unicode-то - двубайтный. Для латинских букв старший байт содержит 0, а младший -- ASCII-код. Т.е. там всё нормально.

Цитата(informn @ 24.7.2005, 18:20)
При преобразовании WideCharToMultiByte он преобразует не всю строку, а только её часть до первого 0.

Сам не проверял и никогда с этой функцией не работал, но похоже, что это ты что-то не так делаешь.

Автор: maxim1000 25.7.2005, 14:09
попробуй вручную посчитать длину строки и передать ее вместо -1
хотя все равно что-то не то...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)