Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Конвертация AnsiString из одной кодовой страницы в другую / 25 сообщений из 28, страница 1 из 2
10.11.2021, 20:08
    #40110863
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Всем добрый вечер!
Поставило руководство задачу конвертировать XML из ANSI в UTF8..все бы ни чего, да в постановке задачи написали: Конвертация из CodePageIN в CodePageOut.
Я набросал небольшой код, который делает это:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
function ConvertCodePage(const S: RawByteString; CodePageIn, CodePageOut: Integer): RawByteString;
begin
  Result := S;
  SetCodePage(Result, CodePageIn, False);
  SetCodePage(Result, CodePageOut, True);
end;

var
  s_in, s_out: RawByteString;
  f_in, f_out: TMemoryStream;
begin
  f_in := TMemoryStream.Create;
  try
    f_in.LoadFromFile('c:\Source\Delphi\ConvertCP\Win32\Debug\ansi.txt');
    f_in.Position := 0;
    SetLength(s_in, f_in.Size);
    f_in.Read(s_in[1], f_in.Size);
  finally
    f_in.Free;
  end;
  s_out := ConvertCodePage(s_in, 1251, 65001);
  //s_out := UTF8Encode(s_in);
  f_out := TMemoryStream.Create;
  try
    f_out.SetSize(Length(s_out));
    f_out.Write(s_out[1], Length(s_out));
    f_out.Position := 0;
    f_out.SaveToFile('c:\Source\Delphi\ConvertCP\Win32\Debug\utf8.txt');
  finally
    f_out.Free;
  end;
end.



НО самое страшное, что это код для Delphi 10, а нужно реализовать для Delphi 7 :(
Есть ли какой либо аналог RawByteString в JCL или какой либо другой библиотеки для реализации поставленной задачи ?
...
Рейтинг: 0 / 0
10.11.2021, 20:26
    #40110872
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Lisichkin
или какой либо другой библиотеки для реализации поставленной задачи ?


Есть функции winapi:
MultiByteToWideChar
WideCharToMultiByte
...
Рейтинг: 0 / 0
10.11.2021, 20:32
    #40110874
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Как конвертировать из ANSI в UTF8 в Delphi 7 я знаю:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
function ConvertCP(vCodePageIn, vCodePageOut: Integer; const pXML_DATA: WideString): UTF8String;
begin
  if (vCodePageIn=1251) and (vCodePageOut=65001) then
    Result := UTF8Encode(pXML_DATA)
  else
    raise Exception.Create('Convert from '+IntToStr(vCodePageIn)+' to '+IntToStr(vCodePageOut)+' not implementing yet');
end;



А Win API есть только параметр <UINT CodePage> и ГеДе Ви увидели CodePageIn/CodePageOut ?
...
Рейтинг: 0 / 0
10.11.2021, 20:35
    #40110876
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Lisichkin
ГеДе Ви увидели CodePageIn/CodePageOut ?
Конвертацию CodePageIn -> UTF-16 -> CodePageOut не предлагать?
...
Рейтинг: 0 / 0
10.11.2021, 20:44
    #40110878
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Lisichkin

А Win API есть только параметр <UINT CodePage> и ГеДе Ви увидели CodePageIn/CodePageOut ?

А Ви таки определения функций посмотрите
...
Рейтинг: 0 / 0
10.11.2021, 23:12
    #40110905
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
LisichkinНО самое страшное, что это код для Delphi 10

Нет, самое страшное, что этот код совершенно бесполезен, поскольку XML нельзя
преобразовывать просто как строку. У него есть заголовок и кодировка всего
остального должна этому заголовку соответствовать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.11.2021, 08:53
    #40110938
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Я не корректно написал: нужно конвертировать не XML, а результат выполнения скрипта.
Просто у меня для теста был как раз XML. В общем случае, результатом выполнения скрипта, может быть любой байт код.
...
Рейтинг: 0 / 0
11.11.2021, 09:28
    #40110948
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
А чем TEncoding не прет?
...
Рейтинг: 0 / 0
11.11.2021, 09:59
    #40110953
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Lisichkin
Поставило руководство задачу конвертировать XML из ANSI в UTF8..все бы ни чего, да в постановке задачи написали: Конвертация из CodePageIN в CodePageOut.
Очень мне это напоминает тестовое задание при приеме на работу
...
Рейтинг: 0 / 0
11.11.2021, 10:00
    #40110954
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
rgreat
А чем TEncoding не прет?
ТС хочет Д7
...
Рейтинг: 0 / 0
11.11.2021, 11:36
    #40110975
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
_Vasilisk_,

А, некрофилия, ясно.
...
Рейтинг: 0 / 0
11.11.2021, 13:13
    #40110997
Lisichkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Не некрофилия, а очень известная в узких кругах МИС :)

Я посмотрел исходники ConvertCP: https://sourceforge.net/projects/convertcp/files/
Объем кода не порадовал - использование Win API MultiByteToWideChar/WideCharToMultiByte есть - но это только вершина айсберга.
Хотелось бы использовать что то уже имеющееся (библиотеку) и да, для D7
...
Рейтинг: 0 / 0
11.11.2021, 13:48
    #40111005
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
LisichkinОбъем кода не порадовал - использование Win API
MultiByteToWideChar/WideCharToMultiByte есть - но это только вершина айсберга.

Четыре их вызова + две проверки на ошибку и выделение буфера. Итого восемь
строчек. Вас огорчает так много букафф?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.11.2021, 15:30
    #40111049
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Lisichkin
Я посмотрел исходники ConvertCP: https://sourceforge.net/projects/convertcp/files/
Объем кода не порадовал - использование Win API MultiByteToWideChar/WideCharToMultiByte есть - но это только вершина айсберга.

Ну ты бы еще в исходники опенофиса залез...
На самом деле MultiByteToWideChar и всё, из него можно уже более привычной Utf8Encode (она вроде бы уже была в D7)
...
Рейтинг: 0 / 0
11.11.2021, 16:00
    #40111056
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Dimitry Sibiryakov
Четыре их вызова + две проверки на ошибку и выделение буфера. Итого восемь
Откуда восемь? Четыре всего. По два вызова на каждую конвертацию
...
Рейтинг: 0 / 0
11.11.2021, 16:07
    #40111057
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
_Vasilisk_Четыре всего. По два вызова на каждую конвертацию

Плюс две проверки на ошибку и два выделения памяти. Итого - восемь строк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.11.2021, 16:33
    #40111068
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Dimitry Sibiryakov
Плюс две проверки на ошибку и два выделения памяти. Итого - восемь строк.
А, ну да. Я считал только вызовы функций.
...
Рейтинг: 0 / 0
12.11.2021, 10:36
    #40111228
Наталья87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Lisichkin
Всем добрый вечер!
Поставило руководство задачу конвертировать XML из ANSI в UTF8..все бы ни чего, да в постановке задачи написали: Конвертация из CodePageIN в CodePageOut.
Я набросал небольшой код, который делает это:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
function ConvertCodePage(const S: RawByteString; CodePageIn, CodePageOut: Integer): RawByteString;
begin
  Result := S;
  SetCodePage(Result, CodePageIn, False);
  SetCodePage(Result, CodePageOut, True);
end;

var
  s_in, s_out: RawByteString;
  f_in, f_out: TMemoryStream;
begin
  f_in := TMemoryStream.Create;
  try
    f_in.LoadFromFile('c:\Source\Delphi\ConvertCP\Win32\Debug\ansi.txt');
    f_in.Position := 0;
    SetLength(s_in, f_in.Size);
    f_in.Read(s_in[1], f_in.Size);
  finally
    f_in.Free;
  end;
  s_out := ConvertCodePage(s_in, 1251, 65001);
  //s_out := UTF8Encode(s_in);
  f_out := TMemoryStream.Create;
  try
    f_out.SetSize(Length(s_out));
    f_out.Write(s_out[1], Length(s_out));
    f_out.Position := 0;
    f_out.SaveToFile('c:\Source\Delphi\ConvertCP\Win32\Debug\utf8.txt');
  finally
    f_out.Free;
  end;
end.



НО самое страшное, что это код для Delphi 10, а нужно реализовать для Delphi 7 :(
Есть ли какой либо аналог RawByteString в JCL или какой либо другой библиотеки для реализации поставленной задачи ?


DLL-ку с нужным функционалом написать на XE-10 и подключить к Delphi 7. Решение рабочее хоть и немного костыльное. Заодно будет стимулировать переходить на XE-10.
...
Рейтинг: 0 / 0
12.11.2021, 11:07
    #40111240
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Наталья87
DLL-ку с нужным функционалом написать на XE-10
Один вопрос: зачем?
...
Рейтинг: 0 / 0
12.11.2021, 11:51
    #40111254
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Приверженцы ректальной тонзиллэктомии не сдаются!
...
Рейтинг: 0 / 0
12.11.2021, 12:49
    #40111272
Наталья87
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Fr0sT-Brutal
Приверженцы ректальной тонзиллэктомии не сдаются!


Нет, ректальная тонзиллэктомия - это написать приложение (exe) на D XE10 с нужным функционалом, вызывать его через командную строку с нужными параметрами, результат возвращать через файлы. Приходилось так делать, работая с 1С 7.7, т. к. она нормально с DLL не работает и сам формат DLL такой там, что без бутылки не разобраться.

С DLL решение куда красивее, но не во всех случаях применимо.



_Vasilisk_
Наталья87
DLL-ку с нужным функционалом написать на XE-10
Один вопрос: зачем?


Чтобы решить задачу, сдать результат заказчику и побыстрее забыть. И не насиловать морально устаревшую D7.
...
Рейтинг: 0 / 0
12.11.2021, 13:19
    #40111287
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Наталья87
Приходилось так делать, работая с 1С 7.7, т. к. она нормально с DLL не работает и сам формат DLL такой там, что без бутылки не разобраться.

С DLL решение куда красивее, но не во всех случаях применимо.
1С 7.7 прекрасно работало с дельфевыми активыксами. Делал не раз.
...
Рейтинг: 0 / 0
12.11.2021, 13:25
    #40111290
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Наталья87Приходилось так делать, работая с 1С 7.7, т. к. она нормально с DLL не работает
и сам формат DLL такой там, что без бутылки не разобраться.

Для человека, не осилившего найти пункт меню "View Source", это звучит не очень
убедительно...

И да, выносить целых восемь строчек в DLL, это тоже вполне Ваш стиль.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.11.2021, 13:40
    #40111306
Дегтярев Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
авторЧтобы решить задачу, сдать результат заказчику и побыстрее забыть. И не насиловать морально устаревшую D7.
херак-херак и в продакшн
...
Рейтинг: 0 / 0
12.11.2021, 14:12
    #40111331
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Конвертация AnsiString из одной кодовой страницы в другую
Наталья87
Чтобы решить задачу, сдать результат заказчику и побыстрее забыть. И не насиловать морально устаревшую D7.

Заказчик хочет D7. Вряд ли он обрадуется куску софта, написанному в недоступной и очень сильно платной среде. Толку от этой DLL, если ее даже не пересобрать? Тогда уж хотя бы FPC присоветовали. Ну или ICU бахнуть - а что, модно, стильно и х-платформно
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Конвертация AnsiString из одной кодовой страницы в другую / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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