Действия по включению и использованию iconv в Windows с Indy 10.5.9

Для кроссплатформенной разработки с Internet Direct (Indy) может быть полезно вместо этого включить поддержку icon. преобразований символов Windows для конкретных ОС.

Это позволило бы продолжить разработку и тестирование кода для Windows в Delphi IDE, но при этом иметь возможность находить проблемы, связанные с преобразованием, перед компиляцией кода на другой платформе.

Indy 10 уже включает код для использования iconv API в Linux и Windows.

В Windows требуется некоторая подготовка:

  • скопируйте DLL API iconv в папку приложения или путь поиска
  • определить условный символ use_iconv

Цель этого вопроса — помочь начать работу с iconv на платформе Windows.


person mjn    schedule 03.01.2013    source источник
comment
Ни Википедия, ни Google не подсказывают мне достаточно авторитетный веб-сайт для загрузки Windows iconv.dll, откуда вы взяли свою?   -  person Stijn Sanders    schedule 03.01.2013
comment
@StijnSanders, коллекция программного обеспечения, включающая iconv, является проектом GnuWin на gnuwin32.sourceforge.net.   -  person mjn    schedule 03.01.2013


Ответы (2)


Если я быстро взгляну на iconv.h, который я нашел в gettext для проекта windows sourceforge, и если я правильно понял код C, модуль-оболочка для iconv.dll мог бы выглядеть так и мог бы использоваться для ввода и вывода компонентов Indy.

unit iconv;

interface

//based on version 1.9.1 https://sourceforge.net/projects/gettext/

type
  TIconv = pointer;

function iconv_open(const PAnsiChar:tocode; const PAnsiChar:fromcode): TIconv; cdecl;
function iconv(cd:TIconv; var inbuf:PAnsiChar; var inbytesleft:integer; var output:PAnsiChar; var outbytesleft:integer): integer; cdecl;
function iconv_close(cd:TIconv): integer; cdecl;

const
  ICONV_TRIVIALP            =0;  // int *argument
  ICONV_GET_TRANSLITERATE   =1;  // int *argument
  ICONV_SET_TRANSLITERATE   =2;  // const int *argument
  ICONV_GET_DISCARD_ILSEQ   =3;  // int *argument
  ICONV_SET_DISCARD_ILSEQ   =4;  // const int *argument

type
  TiconvlistDoOne=function(namescount:cardinal; const names:PAnsiChar; data:pointer): integer; cdecl;

function iconvctl(cd:TIconv; request:integer; argument:pointer): integer; cdecl;
procedure iconvlist(do_one:TiconvlistDoOne; data:pointer); cdecl;
procedure libiconv_set_relocation_prefix(const orig_prefix:PAnsiChar; const curr_prefix:PAnsiChar); cdecl;

implementation

function iconv_open; external 'iconv.dll';
function iconv; external 'iconv.dll';
function iconv_close; external 'iconv.dll';
function iconvctl; external 'iconv.dll';
procedure iconvlist; external 'iconv.dll';
procedure libiconv_set_relocation_prefix; external 'iconv.dll';

end.
person Stijn Sanders    schedule 03.01.2013
comment
У Indy уже есть код для доступа к API iconv. Я обновлю свой вопрос. - person mjn; 03.01.2013

Free Pascal имеет заголовок iconv (пакет iconvenc), и он либо совместим с delphi, либо должен быть легко обновляемым. Получите его от FPC websvn интерфейсный модуль iconvenc или последний RC (2.6.2rc1), так как он мог обновиться с версии 2.6.0.

Но это сложнее, чем просто предоставить заголовок, поскольку iconv в Windows не поддерживает errno и, следовательно, не может обрабатывать EILSEQ и EI2BIG, поэтому вам нужно правильно выделить память впереди (например, 4 * charsize).

У меня есть код, как обрабатывать цели iconv без ошибок PHP, но он не очень хорошо протестирован. (см. src/iconvert.inc)

person Marco van de Voort    schedule 03.01.2013
comment
Большое спасибо за ваш ответ! Я обновил свой вопрос, у Indy уже есть код для использования библиотеки iconv на платформе Windows. Мой вопрос требует только базовой документации по этой функции. - person mjn; 03.01.2013
comment
Затем убедитесь, что найденная вами DLL совпадает с той, которую задумал Indy. Посмотрите, нет ли у них копии на FTP-сервере. Различные сборки Windows могут иметь разные компромиссы в отношении проблемы с ошибкой. - person Marco van de Voort; 03.01.2013
comment
Indy не предоставляет собственную копию библиотеки ICONV для какой-либо платформы. Он использует любую DLL, установленную на платформе или предоставленную пользователем. Текущий код поддержки ICONV в Indy вообще не использует errno, поскольку он не может получить доступ к errno независимым от платформы способом. Тем не менее, я проделал некоторую работу (которая еще не проверена), чтобы добавить поддержку errno в модуль IdIconv.pas под Windows (через msvcrt.dll) и Unix (через cerrno), но в лучшем случае это все еще экспериментально. - person Remy Lebeau; 03.01.2013
comment
Если значок PHP действительно обновляет эту ошибку, и если он доступен в потокобезопасном режиме (из Delphi независимым от версии способом). Я не думаю, что PHP (см. ссылку) имеет возможность отключить проверку errno ни за что. - person Marco van de Voort; 03.01.2013