Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Конвертация AnsiString из одной кодовой страницы в другую  [new]
Lisichkin
Member

Откуда:
Сообщений: 497
Всем добрый вечер!
Поставило руководство задачу конвертировать XML из ANSI в UTF8..все бы ни чего, да в постановке задачи написали: Конвертация из CodePageIN в CodePageOut.
Я набросал небольшой код, который делает это:

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 или какой либо другой библиотеки для реализации поставленной задачи ?
10 ноя 21, 20:08    [22394406]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
x1ca4064
Member

Откуда:
Сообщений: 1356
Lisichkin
или какой либо другой библиотеки для реализации поставленной задачи ?


Есть функции winapi:
MultiByteToWideChar
WideCharToMultiByte
10 ноя 21, 20:26    [22394415]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Lisichkin
Member

Откуда:
Сообщений: 497
Как конвертировать из ANSI в UTF8 в Delphi 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 ?
10 ноя 21, 20:32    [22394417]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
Lisichkin
ГеДе Ви увидели CodePageIn/CodePageOut ?
Конвертацию CodePageIn -> UTF-16 -> CodePageOut не предлагать?
10 ноя 21, 20:35    [22394419]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
x1ca4064
Member

Откуда:
Сообщений: 1356
Lisichkin

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

А Ви таки определения функций посмотрите
10 ноя 21, 20:44    [22394422]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

Lisichkin
НО самое страшное, что это код для Delphi 10

Нет, самое страшное, что этот код совершенно бесполезен, поскольку XML нельзя
преобразовывать просто как строку. У него есть заголовок и кодировка всего
остального должна этому заголовку соответствовать.

Posted via ActualForum NNTP Server 1.5

10 ноя 21, 23:12    [22394468]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Lisichkin
Member

Откуда:
Сообщений: 497
Я не корректно написал: нужно конвертировать не XML, а результат выполнения скрипта.
Просто у меня для теста был как раз XML. В общем случае, результатом выполнения скрипта, может быть любой байт код.

Сообщение было отредактировано: 11 ноя 21, 08:54
11 ноя 21, 08:53    [22394522]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
rgreat
Member

Откуда:
Сообщений: 7024
А чем TEncoding не прет?
11 ноя 21, 09:28    [22394533]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
Lisichkin
Поставило руководство задачу конвертировать XML из ANSI в UTF8..все бы ни чего, да в постановке задачи написали: Конвертация из CodePageIN в CodePageOut.
Очень мне это напоминает тестовое задание при приеме на работу
11 ноя 21, 09:59    [22394540]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
rgreat
А чем TEncoding не прет?
ТС хочет Д7

Сообщение было отредактировано: 11 ноя 21, 10:00
11 ноя 21, 10:00    [22394541]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
rgreat
Member

Откуда:
Сообщений: 7024
_Vasilisk_,

А, некрофилия, ясно.
11 ноя 21, 11:36    [22394576]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Lisichkin
Member

Откуда:
Сообщений: 497
Не некрофилия, а очень известная в узких кругах МИС :)

Я посмотрел исходники ConvertCP: https://sourceforge.net/projects/convertcp/files/
Объем кода не порадовал - использование Win API MultiByteToWideChar/WideCharToMultiByte есть - но это только вершина айсберга.
Хотелось бы использовать что то уже имеющееся (библиотеку) и да, для D7
11 ноя 21, 13:13    [22394605]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

Lisichkin
Объем кода не порадовал - использование Win API
MultiByteToWideChar/WideCharToMultiByte есть - но это только вершина айсберга.

Четыре их вызова + две проверки на ошибку и выделение буфера. Итого восемь
строчек. Вас огорчает так много букафф?..

Posted via ActualForum NNTP Server 1.5

11 ноя 21, 13:48    [22394623]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 985
Lisichkin
Я посмотрел исходники ConvertCP: https://sourceforge.net/projects/convertcp/files/
Объем кода не порадовал - использование Win API MultiByteToWideChar/WideCharToMultiByte есть - но это только вершина айсберга.

Ну ты бы еще в исходники опенофиса залез...
На самом деле MultiByteToWideChar и всё, из него можно уже более привычной Utf8Encode (она вроде бы уже была в D7)
11 ноя 21, 15:30    [22394677]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
Dimitry Sibiryakov
Четыре их вызова + две проверки на ошибку и выделение буфера. Итого восемь
Откуда восемь? Четыре всего. По два вызова на каждую конвертацию
11 ноя 21, 16:00    [22394688]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

_Vasilisk_
Четыре всего. По два вызова на каждую конвертацию

Плюс две проверки на ошибку и два выделения памяти. Итого - восемь строк.

Posted via ActualForum NNTP Server 1.5

11 ноя 21, 16:07    [22394689]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
Dimitry Sibiryakov
Плюс две проверки на ошибку и два выделения памяти. Итого - восемь строк.
А, ну да. Я считал только вызовы функций.
11 ноя 21, 16:33    [22394707]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Наталья87
Member

Откуда:
Сообщений: 114
Lisichkin
Всем добрый вечер!
Поставило руководство задачу конвертировать XML из ANSI в UTF8..все бы ни чего, да в постановке задачи написали: Конвертация из CodePageIN в CodePageOut.
Я набросал небольшой код, который делает это:

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.
12 ноя 21, 10:36    [22394941]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 13358
Наталья87
DLL-ку с нужным функционалом написать на XE-10
Один вопрос: зачем?
12 ноя 21, 11:07    [22394962]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 985
Приверженцы ректальной тонзиллэктомии не сдаются!
12 ноя 21, 11:51    [22394985]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Наталья87
Member

Откуда:
Сообщений: 114
Fr0sT-Brutal
Приверженцы ректальной тонзиллэктомии не сдаются!


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

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



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


Чтобы решить задачу, сдать результат заказчику и побыстрее забыть. И не насиловать морально устаревшую D7.

Сообщение было отредактировано: 12 ноя 21, 12:50
12 ноя 21, 12:49    [22395018]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4936
Наталья87
Приходилось так делать, работая с 1С 7.7, т. к. она нормально с DLL не работает и сам формат DLL такой там, что без бутылки не разобраться.

С DLL решение куда красивее, но не во всех случаях применимо.
1С 7.7 прекрасно работало с дельфевыми активыксами. Делал не раз.

Сообщение было отредактировано: 12 ноя 21, 13:19
12 ноя 21, 13:19    [22395035]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791

Наталья87
Приходилось так делать, работая с 1С 7.7, т. к. она нормально с DLL не работает
и сам формат DLL такой там, что без бутылки не разобраться.

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

И да, выносить целых восемь строчек в DLL, это тоже вполне Ваш стиль.

Posted via ActualForum NNTP Server 1.5

12 ноя 21, 13:25    [22395039]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Дегтярев Евгений
Member

Откуда: Барнаул
Сообщений: 2093
автор
Чтобы решить задачу, сдать результат заказчику и побыстрее забыть. И не насиловать морально устаревшую D7.

херак-херак и в продакшн
12 ноя 21, 13:40    [22395058]     Ответить | Цитировать Сообщить модератору
 Re: Конвертация AnsiString из одной кодовой страницы в другую  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 985
Наталья87
Чтобы решить задачу, сдать результат заказчику и побыстрее забыть. И не насиловать морально устаревшую D7.

Заказчик хочет D7. Вряд ли он обрадуется куску софта, написанному в недоступной и очень сильно платной среде. Толку от этой DLL, если ее даже не пересобрать? Тогда уж хотя бы FPC присоветовали. Ну или ICU бахнуть - а что, модно, стильно и х-платформно
12 ноя 21, 14:12    [22395090]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить