Delphi поддерживает Unicode в компиляторе, используя WideString.
Но вы столкнетесь со следующими проблемами:
- Delphi <2009 не поддерживает юникод в своих VCL. </li>
- В API-вариантах ANSI (например, OpenFileA) сделано много сопоставлений API.
- Компилятор delphi будет часто преобразовывать WideStrings в строку, поэтому будьте предельно откровенны с ними.
Это будет работать, если вы используете необработанные интерфейсы API Unicode для Windows.
Таким образом, FindFirst использует API FindFirstFile , который delphi сопоставляется с вариантом FindFirstFileA, и вам необходимо напрямую вызвать FindFirstW.
Таким образом, у вас будет 2 варианта.
- Обновите до Delphi 2009 и сделайте много юникодных сопоставлений для вас
- Напишите свои собственные функции отображения Unicode
Для записи текстового файла вы можете использовать GpTextFile или GpTextSteam от Primoz Gabrijelcic (он же gabr), они имеют поддержку юникода.
Это пример открытия файла с именем файла в юникоде:
function OpenLongFileName(const ALongFileName: WideString; SharingMode: DWORD): THandle; overload;
begin
if CompareMem(@(WideCharToString(PWideChar(ALongFileName))[1]), @('\\'[1]), 2) then
{ Allready an UNC path }
Result := CreateFileW(PWideChar(ALongFileName), GENERIC_READ, SharingMode, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
else
Result := CreateFileW(PWideChar('\\?\' + ALongFileName), GENERIC_READ, SharingMode, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
end;
function CreateLongFileName(const ALongFileName: WideString; SharingMode: DWORD): THandle; overload;
begin
if CompareMem(@(WideCharToString(PWideChar(ALongFileName))[1]), @('\\'[1]), 2) then
{ Allready an UNC path }
Result := CreateFileW(PWideChar(ALongFileName), GENERIC_WRITE, SharingMode, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
else
Result := CreateFileW(PWideChar('\\?\' + ALongFileName), GENERIC_WRITE, SharingMode, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
end;
Я использовал эти функции, потому что для API-интерфейса ANSI ограничение пути составляет 254 символа, а для Unicode - 2 ^ 16 символов, если я не ошибаюсь.
После того, как вы получили дескриптор файла, вы можете просто вызвать обычное отображение delphi api ReadFile, чтобы прочитать данные из вашего файла.