С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Fakels
33 / 19 / 4
Регистрация: 07.03.2015
Сообщений: 281
1

Злосчастный wchar_t

04.11.2017, 02:05. Просмотров 156. Ответов 0
Метки нет (Все метки)

Перешел с 6 Builder на XE3, перелопатил проект чтобы компилировалось.
НО теперь программа не правильно работает из-за того что текст конвертируется из char в wchar_t, т.е. ели изначально текст был в нормальной кодировке, то поле wchar_t он получается из одних квадратиков.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DWORD dwFileSize, dwFileSize2;
   HANDLE h_lst;
   BYTE *lstbuf;
   ULONG i;
   h_lst = OpenFileX(filename);
   if (h_lst == INVALID_HANDLE_VALUE)
      return false;
   dwFileSize = GetFileSizeX(h_lst, &dwFileSize2);
   if ((lstbuf = (BYTE *)malloc(dwFileSize + 1)) == NULL)
   {
      CloseHandleX (h_lst);
      return false;
   }
   ReadFileX(h_lst, lstbuf, dwFileSize, &i); 
   CloseHandleX (h_lst);
   lstbuf[dwFileSize] = 0x00;
   pList->SetText((wchar_t*)lstbuf);   //TODO: bug (неправильная кодировка)
   free(lstbuf);
pList->SetText((wchar_t*)lstbuf);
Беда вот в этой строке, переменная pList это класс TStringList
Как сделать чтобы текст из файла заносился в TStringList в ANSI кодировке а не в юникоде?

Или вообще как сделать чтобы программа была полностью на ANSI(как изначально на bulder 6) и не использовался этот wchar_t ???

Добавлено через 18 часов 23 минуты
Преобразовал с помощью этого кода
C++
1
2
3
4
wchar_t* lstbufW = new wchar_t[dwFileSize];
mbstowcs(lstbufW,lstbuf,dwFileSize);
 
pList->SetText(lstbufW);   //TODO: wchar_t bug
Квадратов не стало, но теперь эта злосчастная дрянь не понимает русскую кодировку win-1251 и Oem866, и показывает нам кракозяблы.
Как теперь работать с русскими буквами?

Добавлено через 4 часа 5 минут
В общем соорудил костыль, и теперь перед выводом текста беру символы из строки и вставляю их в char массив, и получаю строку с правильной win-1251 кодировкой.

C++
1
2
3
4
5
         int len = strValue.Length();
         char* strValueA = new char[len];
         for (int c = 0; c < len; c++) {
            strValueA[c] = strValue[c + 1];
         }
Единственное я тут не понял почему по проходу цикла for в конце масива strValueA появляется мусор разной длины, длина цикла правильная.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2017, 02:05
Ответы с готовыми решениями:

Ошибка при подключении к XE3 библиотеки для VS: "Please use native wchar_t type (/Zc:wchar_t)"
Господа, пытаюсь прикрутить к билдеру библиотеку для работы с автокадом. К...

wchar_t and StringGrid
Такой вопрос возник, читаю файл поструктуре struct DATA1 { unsigned int...

Wchar_t и кодировка
Доброго времени суток! Возникла проблема при работе с openGL библиотекой DevIL...

wchar_t * в UnicodeString
как конвертировать тип wchar_t* в String?

Конвертация UnicodeString в wchar_t
Начинаю только изучать С++ . Заранее прошу прощения за такой вопрос, не хотел...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2017, 02:05

wanted 'char *', got 'wchar_t *
Перешол на XE2 открыл старый проэкт а тут куча ошибок Помогите пожалуйста...

Cannot convert 'UnicodeString' to 'wchar_t *
Ребят, подскажите, плиз, как склеить строки: AnsiString programpath =...

Передача в функцию wchar_t **
Здравствуйте. С наступающим:) Подскажите, как передать в функцию переменную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru