Delphi 通过使用 WideString 在编译器中支持 unicode。
但是你会面临以下问题:
- Delphi < 2009 在其 VCL 中不支持 unicode。
- 许多 API 映射是在 API 的 ANSI(例如 OpenFileA)变体上完成的。
- delphi 编译器会大量地将 WideStrings 转换为字符串,因此对它们要非常明确。
如果您使用原始的 unicode windows api,它将起作用。
所以 FindFirst 使用了 delphi 映射到 FindFirstFileA 变体的 api FindFirstFile,你需要直接调用 FindFirstW。
因此,您将有 2 个选择。
- 升级到 Delphi 2009 并为您完成大量 unicode 映射
对于文本文件的编写,您可以使用 Primoz Gabrijelcic(又名 gabr)的GpTextFile或GpTextSteam,它们支持 unicode。
她是使用 unicode 文件名打开文件的示例:
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;
I've used these functions because the ANSI api's have a path limit of 254 chars, the unicode have a limit of 2^16 chars if I'm not mistaken.
After you've got the handle to the file you can just call the regular ReadFile delphi api mapping, to read data from your file.