powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Конвертация AnsiString из одной кодовой страницы в другую
25 сообщений из 28, страница 1 из 2
Конвертация AnsiString из одной кодовой страницы в другую
    #40110863
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 или какой либо другой библиотеки для реализации поставленной задачи ?
...
Рейтинг: 0 / 0
Конвертация AnsiString из одной кодовой страницы в другую
    #40110872
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lisichkin
или какой либо другой библиотеки для реализации поставленной задачи ?


Есть функции winapi:
MultiByteToWideChar
WideCharToMultiByte
...
Рейтинг: 0 / 0
Конвертация AnsiString из одной кодовой страницы в другую
    #40110874
Lisichkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как конвертировать из 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
Конвертация AnsiString из одной кодовой страницы в другую
    #40110876
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lisichkin
ГеДе Ви увидели CodePageIn/CodePageOut ?
Конвертацию CodePageIn -> UTF-16 -> CodePageOut не предлагать?
...
Рейтинг: 0 / 0
Конвертация AnsiString из одной кодовой страницы в другую
    #40110878
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lisichkin

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

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

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

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

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

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

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

Плюс две проверки на ошибку и два выделения памяти. Итого - восемь строк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Конвертация AnsiString из одной кодовой страницы в другую
    #40111068
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Плюс две проверки на ошибку и два выделения памяти. Итого - восемь строк.
А, ну да. Я считал только вызовы функций.
...
Рейтинг: 0 / 0
Конвертация AnsiString из одной кодовой страницы в другую
    #40111228
Наталья87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Конвертация AnsiString из одной кодовой страницы в другую
    #40111240
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наталья87
DLL-ку с нужным функционалом написать на XE-10
Один вопрос: зачем?
...
Рейтинг: 0 / 0
Конвертация AnsiString из одной кодовой страницы в другую
    #40111254
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приверженцы ректальной тонзиллэктомии не сдаются!
...
Рейтинг: 0 / 0
Конвертация AnsiString из одной кодовой страницы в другую
    #40111272
Наталья87
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Fr0sT-Brutal
Приверженцы ректальной тонзиллэктомии не сдаются!


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

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



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


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

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

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

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

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


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