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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование Unicode в программе, есть проблемки 
V
    Опции темы
Pilligrim
Дата 14.3.2007, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Решил перевести свою программу с ANSI на Unicode. Все хорошо, но вот какая проблемка: пишу в файл вот так:

Код

HANDLE file;
LPWSTR file_name;
LPWSTR string;
DWORD writebytes_len;
file = CreateFile(file_name,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
WriteFile(file,string,writebytes_len,&writebytes_len,NULL);
SetEndOfFile(file);
CloseHandle(file);


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

Что делать?

Это сообщение отредактировал(а) Pilligrim - 14.3.2007, 21:19
PM MAIL   Вверх
ama_kid
Дата 14.3.2007, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



А юникод продефайнен?


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Pilligrim
Дата 14.3.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да:

Код

#define UNICODE
#define _UNICODE

PM MAIL   Вверх
dumb
Дата 15.3.2007, 04:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(Pilligrim @  14.3.2007,  21:16 Найти цитируемый пост)
Что делать?

читать, что из себя представляет UNICODE. все вопросы сразу отпадут.

если кратко: записывается в файл у тебя именно "уникодная" строка - просто, судя по всему, ты не имеешь представления о том, как этот самый уникод выглядит... smile
PM MAIL   Вверх
Tectoder
Дата 15.3.2007, 13:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Pilligrim @  14.3.2007,  21:16 Найти цитируемый пост)
в файле явно символов больше, чем я записывал

Ага, в два раза. WriteFile записывает то что ей дают. Эта функция имеет одну реализацию, нет функций WriteFileA и WriteFileW
Если у тебя в программе юникод строки то они и записываются в файл.
Если тебе это не нравится нужно перед записью преобразовывать строки в анси. А после чтения преобразовывать обратно. Но тогда теряютяс плюсы юникода.
Как вариант - перед записью в файл перекодировать строку в кодировку UTF-8. Это "ужатый юникод", кодировка в которой число байт на символ зависит от самого символа. Если у тебя большинство символов английские это поможет сократить размер файла, но также это не лешает возможности писать в файл китайские, русские или ещекакиенибудьстранные символы.
Ну и конечно же надо понимать что такое юникод, прежде чем во всем этом разбираться. В этом может помочь одна из лучших вики-статей http://ru.wikipedia.org/wiki/юникод

Это сообщение отредактировал(а) Tectoder - 15.3.2007, 13:04
PM   Вверх
Pilligrim
Дата 15.3.2007, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата
Ага, в два раза. WriteFile записывает то что ей дают. Эта функция имеет одну реализацию, нет функций WriteFileA и WriteFileW
Если у тебя в программе юникод строки то они и записываются в файл.


Tectoder, оно конечно понятно, но все бы хорошо, если бы я, записывая строки юникод, мог бы потом и считать их. Но это не так... Например русские символы она записывает(а соответственно и считывает потом) не верно.

dumb, представление я имею, и то что символов больше я понимаю почему, но вот про русские символы я не понял до сих пор...

Читаю вот как:
Код

file = CreateFile(file_name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
ReadFile(file,&LPWSTR,readbytes_len,&readbytes_len,NULL);

PM MAIL   Вверх
Tectoder
Дата 15.3.2007, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Pilligrim @  15.3.2007,  20:53 Найти цитируемый пост)
,&LPWSTR
 Все таки лучше писать полностью тот код, который вы используете, а не отредактированный фрагмент.

Это сообщение отредактировал(а) Tectoder - 15.3.2007, 21:25
PM   Вверх
Pilligrim
Дата 16.3.2007, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привожу код:
Код


HWND hwndLB;//ListBox

enum CACHE_TYPE
    {BASE_END,//Reserved: обозначает конец базы файлов
     BASE_BEGIN,//Reserved
     FILE_LINK,
     TEXT_FRAG
    };

struct CACHE
    {CACHE_TYPE type;
     wchar_t* string;
    };
//Save_DATA сохраняет базу данных
void wSave_DATA(LPWSTR file_name)
        {HANDLE file;
     DWORD writebytes_len;
          bool writeresult;
     DWORD str_len;
     int item_data;
     CACHE* lpcache;
     UINT item_num;
     int base_end;
            
     if(file_name==NULL) return;

     file = CreateFile(file_name,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_         ATTRIBUTE_NORMAL,NULL);
     if(file==INVALID_HANDLE_VALUE) return;

     for(item_num=0;;item_num++)
             {item_data=SendMessageW(hwndLB,LB_GETITEMDATA,item_num,item_num); 
               
             if(item_data == LB_ERR) break;

             lpcache = (CACHE*)item_data;
               
             writebytes_len = sizeof(lpcache->type);
             writeresult = WriteFile(file,&lpcache->type,writebytes_len,&writebytes_len,NULL);
             if(writeresult && writebytes_len==0)
                      break;

             str_len = lstrlenW(lpcache->string);
             str_len = str_len*sizeof(TCHAR);
             writebytes_len = sizeof(str_len);
             writeresult = WriteFile(file,&str_len,writebytes_len,&writebytes_len,NULL);
             if(writeresult && writebytes_len==0)
                 break;

                  writebytes_len = str_len;
             writeresult = WriteFile(file,lpcache->string,writebytes_len,&writebytes_len,NULL);
             if(writeresult && writebytes_len==0)
            break;
             lpcache = NULL;
             }
     base_end = BASE_END;
     writebytes_len = sizeof(base_end);
     writeresult = WriteFile(file,&base_end,writebytes_len,&writebytes_len,NULL);
     SetEndOfFile(file);
     CloseHandle(file);
    }

//Load_DATA загружает базу данных     
bool wLoad_DATA(LPWSTR file_name)
       {HANDLE file;
         wchar_t data[MAX_PATH];
         CACHE_TYPE type;
         DWORD readbytes_len;
         bool readresult;
         DWORD str_len;

         if(file_name==NULL) return false;
         if(!wCheckFileType((LPWSTR)file_name,L"fls") && !wCheckFileType((LPWSTR)file_name,L"bfr")) 
             return false;          
         file = CreateFile(file_name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_                ATTRIBUTE_NORMAL,NULL);
         if(file==INVALID_HANDLE_VALUE) return false;
         SendMessageW(hwndLB,LB_RESETCONTENT,0,0);

         readbytes_len = 4;               
         readresult = ReadFile(file,&type,readbytes_len,&readbytes_len,NULL);          
         while(1)
                 {readbytes_len = sizeof(type);               
                 readresult = ReadFile(file,&type,readbytes_len,&readbytes_len,NULL);
                 if(readresult && readbytes_len==0) 
              {CloseHandle(file);
                return true;}

                 if(type==BASE_END) 
                       {CloseHandle(file);
                         return true;}

                 readbytes_len = sizeof(str_len);               
                 readresult = ReadFile(file,&str_len,readbytes_len,&readbytes_len,NULL);
                 if(readresult && readbytes_len==0) 
                       {CloseHandle(file);
                         return true;}
               
                 str_len = str_len*sizeof(TCHAR);
                 readbytes_len = str_len;
                 readresult = ReadFile(file,data,readbytes_len,&readbytes_len,NULL);
                 if(readresult && readbytes_len==0) 
                         {CloseHandle(file);
                           return true;}
                 data[readbytes_len] = 0x0000;
                 wAdd_DATA(type,data);
                 }
    CloseHandle(file);
    return true;
}



Код прямо из проги вырвал. Если какие-нить переменные не объявлены - спрашивайте.
PM MAIL   Вверх
Pilligrim
Дата 18.3.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем спасибо! 

Проблемы оказывается и не было, это все Блокнот виндовский. Он виноват!!! Он юникод каряво понимает как-то... 

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

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


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

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


 




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


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

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