将以特定Ansi编码编码的文件转换为Unicode string (UTF-16 LE),使用 MultiByteToWideChar 功能 :
string
MultiByteToWideChar
function MultiByteToWideChar( CodePage: UINT; dwFlags: DWORD; const lpMultiByteStr: AnsiString; cchMultiByte: Integer; lpWideCharStr: string; cchWideChar: Integer): Integer; external 'MultiByteToWideChar@kernel32.dll stdcall'; function LoadStringFromFileInCP(FileName: string; var S: string; CP: Integer): Boolean; var Ansi: AnsiString; Len: Integer; begin Result := LoadStringFromFile(FileName, Ansi); if Result then begin Len := MultiByteToWideChar(CP, 0, Ansi, Length(Ansi), S, 0); SetLength(S, Len); MultiByteToWideChar(CP, 0, Ansi, Length(Ansi), S, Len); end; end; function LoadStringsFromFileInCP( FileName: string; Strings: TStrings; CP: Integer): Boolean; var S: string; begin Result := LoadStringFromFileInCP(FileName, S, CP); if Result then Strings.Text := S; end;
(注意我正在使用 TStrings 存储字符串/行集合而不是 TArrayOfString ,作为 TStrings 更容易使用)
TStrings
TArrayOfString
转换Unicode string 回到安西,使用 WideCharToMultiByte 功能 :
WideCharToMultiByte
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: Integer; lpMultiByteStr: AnsiString; cchMultiByte: Integer; lpDefaultCharFake: Integer; lpUsedDefaultCharFake: Integer): Integer; external 'WideCharToMultiByte@kernel32.dll stdcall'; function SaveStringToFileInCP(FileName: string; S: string; CP: Integer): Boolean; var Ansi: AnsiString; Len: Integer; begin Len := WideCharToMultiByte(CP, 0, S, Length(S), Ansi, 0, 0, 0); SetLength(Ansi, Len); WideCharToMultiByte(CP, 0, S, Length(S), Ansi, Len, 0, 0); Result := SaveStringToFile(FileName, Ansi, False); end; function SaveStringsToFileInCP( FileName: string; Strings: TStrings; CP: Integer): Boolean; begin Result := SaveStringToFileInCP(FileName, Strings.Text, CP); end;
使用如下功能:
const CP_EUC_KOREAN = 51949; var I: Integer; Strings: TStrings; begin Strings := TStringList.Create; if LoadStringsFromFileInCP('korean.txt', Strings, CP_EUC_KOREAN) then begin for I := 0 to Strings.Count - 1 do begin MsgBox(Strings[I], mbInformation, MB_OK); end; end; SaveStringsToFileInCP('korean_out.txt', Strings, CP_EUC_KOREAN); end;
在我的英文系统上正常工作: