powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Прочитать файл в кодировке UCS-2 LE BOM
9 сообщений из 9, страница 1 из 1
Прочитать файл в кодировке UCS-2 LE BOM
    #39597713
SQLWalker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть действующий достаточно большой проект в С++ Builder 6.
В проект надо добавить функционал чтения CSV файла, разбора его строк на отдельные поля и запись
значений в рабочую БД.
Все решается достаточно просто, но камень преткновения - это кодировка CSV файла, который формируется
сторонним ресурсом. Кодировка UCS-2 LE BOM, одна из разновидностей UTF16.

Надо читать файл и преобразовывать строки в CP1251.
Пробую считать весь файл в буфер при помощи TFileStream и его метода Read.
А как дальше содержимое буфера преобразовать в ANSI?

Запутался с ф-циями MultiByteToWideChar
...
Рейтинг: 0 / 0
Прочитать файл в кодировке UCS-2 LE BOM
    #39597717
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLWalkerЗапутался с ф-циями MultiByteToWideChar

Потому что тебе нужна как раз обратная - WideCharToMultibyte. Или тупо используешь
UnitodeToAnsi из VCL.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прочитать файл в кодировке UCS-2 LE BOM
    #39597722
SQLWalker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, спасибо за подсказку, но я все равно дальше не могу продвинуться.

Ну вот есть char Buffer[], в нем считан побайтно нужный файл.
Как именно два раза надо вызвать WideCharToMultibyte, чтоб на выходе получить ANSI?
Какой там должен быть самый первый параметр?
...
Рейтинг: 0 / 0
Прочитать файл в кодировке UCS-2 LE BOM
    #39597724
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLWalkerНу вот есть char Buffer[]

Уже смешно. Если это UCS-2, то должен быть WCHAR Buffer[].
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прочитать файл в кодировке UCS-2 LE BOM
    #39597725
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQLWalkerКак именно два раза надо вызвать WideCharToMultibyte, чтоб на выходе получить ANSI?
Какой там должен быть самый первый параметр?

Открываем документацию, смотрим:
Parameters
CodePage
[in] Specifies the code page used to perform the conversion. This parameter can be given
the value of any code page that is installed or available in the system. For a list of
code pages, see Code Page Identifiers. You can also specify one of the following values.
Value Meaning
CP_ACP ANSI code page
Какое слово тут тебе непонятно?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прочитать файл в кодировке UCS-2 LE BOM
    #39597728
д0kХ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQLWalker,


Ищите для вашего большого проекта в С++ Builder 6
компоненту

#include <iconv.h>
...
Рейтинг: 0 / 0
Прочитать файл в кодировке UCS-2 LE BOM
    #39597800
d7i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из просторов Интернета:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LPSTR xcode(LPCSTR src, UINT srcCodepage, UINT dstCodepage)
{
  int wsize = MultiByteToWideChar(srcCodepage, 0, src, -1, NULL, 0);
  LPWSTR wbuf = (LPWSTR)malloc(wsize*sizeof(WCHAR));
  MultiByteToWideChar(srcCodepage, 0, src, -1, wbuf, wsize);
  int size = WideCharToMultiByte(dstCodepage, 0, wbuf, -1, NULL, 0, NULL, NULL);
  LPSTR buf = (LPSTR)malloc(size);
  WideCharToMultiByte(dstCodepage, 0, wbuf, -1, buf, size, NULL, NULL);
  free(wbuf);
  return buf;
}



srcCodepage=1200 (или какая там надо...)
dstCodepage=1251;

Я таким образом гоняю 1251 (ANSI) => UTF-8 и обратно...
...
Рейтинг: 0 / 0
Прочитать файл в кодировке UCS-2 LE BOM
    #39598059
SQLWalker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
d7iИз просторов Интернета:
srcCodepage=1200 (или какая там надо...)
dstCodepage=1251;

Я таким образом гоняю 1251 (ANSI) => UTF-8 и обратно...

D7i, не работает у меня Ваш код.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 unsigned int srcCodepage = 1200, dstCodepage = 1251;
 int ReadCount;
 char* src;
 AnsiString FileName = "report20180206_10-00.csv";

 TFileStream *MyFile = new TFileStream(FileName, fmOpenRead);
 if(MyFile)
   {
    src = new char[MyFile->Size];
    ReadCount = MyFile->Read(src, MyFile->Size);
   }
  else    {  //error handling 
   }

  int wsize = MultiByteToWideChar(srcCodepage, 0, src, -1, NULL, 0);
  LPWSTR wbuf = (LPWSTR)malloc(wsize*sizeof(WCHAR));

  MultiByteToWideChar(srcCodepage, 0, src, -1, wbuf, wsize);
  int size = WideCharToMultiByte(dstCodepage, 0, wbuf, -1, NULL, 0, NULL, NULL);
  LPSTR buf = (LPSTR)malloc(size);
  WideCharToMultiByte(dstCodepage, 0, wbuf, -1, buf, size, NULL, NULL);



Смотрю отладчиком. Файл в буфер читается нормально. Я вижу в src те же байты, что и HEX-редактором.
ReadCount возвращает реальный размер файла. Но на первом же вызове MultiByteToWideChar(srcCodepage, 0, src, -1, NULL, 0);
wsize возвращает ноль. Понятно, что дальше нет смысла преобразовывать.

Пробую исходный буфер заменить на WCHAR. Опять вижу, что буфер заполнился нормально, но опять на первом вызове
MultiByteToWideChar возвращает 0. Проблема в значении кодовой таблицы 1200?
Вот что пишет MSDN
1200 utf-16 Unicode UTF-16, little endian byte order (BMP of ISO 10646); available only to managed applications
...
Рейтинг: 0 / 0
Прочитать файл в кодировке UCS-2 LE BOM
    #39598081
SQLWalker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, решил по-другому (спасибо Dimitry Sibiryakov), используя ф-ции VCL:

Код: plaintext
1.
2.
UnicodeToUtf8(dst, src, MyFile->Size);
AnsiString Result = Utf8ToAnsi(AnsiString(dst));
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Прочитать файл в кодировке UCS-2 LE BOM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]