Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование Unicode, UTF-8, UTF-16, utf и иже с ним 
:(
    Опции темы
Emura
Дата 14.5.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.2.2009

Репутация: 1
Всего: 1



подскажите пожалуйста последовательность действий для следующей задачи.
есть файл, текстовый в UTF-8. пытаюсь нарисовать его содержимое.

с "нарисовать" думаю проблем нет, для этого нужен массив WCHAR. ...а вот как его извлеч из файла -призадумался чтото, хотя задача то вроде банальная.
PM   Вверх
GremlinProg
Дата 14.5.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



извлечь...
я же давал алгоритм

может что-то непонятно?

Код

FILE*input;
_tfopen_s(&input,_T("C:\\файл.txt"),_T("r, ccs=UTF-8"));

далее чтение: http://forum.vingrad.ru/index.php?showtopi...t&p=1850770
Код

fclose(input);

lpszBuffer или  buffer (там 2 способа), после этого будет содержать контент из UTF-8-файла


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Emura
Дата 14.5.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.2.2009

Репутация: 1
Всего: 1



да-да, смотрел, но недопонял что-то, каша в голове от этих кодировок.. строк smile 

cейчас читаю файл в CHAR* так

Код

            if((textSize = GetFileSize(hFile, 0)) <= 0)// получаем размер в байтах
            {
                return false;
            }

            if((Text = new CHAR[textSize]) == 0)// инициализируем текстовый буфер
            {
                return false;
            }

            ReadFile(hFile, Text, textSize, &readSize, 0);// читаем файл



может сначала прочитать в байты потом их конвертировать в CHAR или WCHAR? 

Код

// определение числа символов в файле
    for(len = 0; !feof(input) ;fgetwc(input),++len);

GremlinProg, а есть еще варианты получить кол-во?




Это сообщение отредактировал(а) Emura - 14.5.2009, 20:09
PM   Вверх
GremlinProg
Дата 14.5.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Emura, символ UTF-8 - не имеет постоянной длины (тут ANSI и UNICODE смешаны),
только ради расчета числа символов, я и прохожу файл дважды:
  первый раз, чтобы получить число символов, перед распределением буфера
  второй раз, чтобы их считать

можно не файл дважды проходить, можно проходить и буфер дважды, но сделать это придется в любом случае
файл обойти проще, тем более, текстовый,
тут особенно оптимизировать просто нет смысла

и проще всего для этого использвать CRT-стримы (stream), а не файлы API (CreateFile),
потому что эта задача в CRT уже решена, велосипед изобретать не надо


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Emura
Дата 14.5.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 7.2.2009

Репутация: 1
Всего: 1



ок, спасибо за советы.

кстати, вот попробовал такое -рисует не потребное smile 

Код

    WCHAR* tow(const CHAR* c, size_t size)
    {
        WCHAR* w = new WCHAR[size];
        mbstowcs(w,c,size);
        return w;
    };    
//...

        CHAR test[] ="тест"; 
        WCHAR *temp = tow(test, strlen(test)+1);

        ExtTextOutW(
            hdc, 
            0, 
            0, 
            ETO_CLIPPED, 
            &r, 
            temp, 
            wcslen(temp), 
            0);


Это сообщение отредактировал(а) Emura - 14.5.2009, 20:30
PM   Вверх
GremlinProg
Дата 14.5.2009, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Emura @  14.5.2009,  22:04 Найти цитируемый пост)
а есть еще варианты получить кол-во?

есть, но цикл все равно нужен:
Код

FILE file;
//
file._flag    = _IOREAD|_IOSTRG|_IOMYBUF;
file._ptr    = file._base = (char*)lpszInput;
file._cnt    = filesize_in_bytes;
for(len = 0; !feof(&file) ;fgetwc(&file),++len);

lpszInput - байтовый буфер, в который предварительно считан файл
причем тут нужно четко определить, имеется ли в файле BOM
это поле идентифиуирует кодировку файла в целом
для UTF-8, это первые 3 байта EF BB BF
если они присутствуют, то их нужно обязательно либо пропустить, либо вообще выбросить
все это уже делает _tfopen_s, без нее - проверяй вручную, но перед инициализацией переменной file



--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 14.5.2009, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



нет, похоже так не получится
тут нужно еще указать кодировку в переменной file
а в CRT она ассоциируется похоже только с файловым дескриптором

так что только читать файл, либо переводить байты напрямую, в  юникод: BytesToUnicode


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1174 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.