如何在delphi中使用MultiByteToWideChar?

时间:2017-07-16 09:02:34

标签: string delphi unicode delphi-xe8

我正在尝试使用MultiByteToWideChar,但我得到了未声明的标识符' 。宣布在哪里?哪个'使用' ?

我正在使用Embarcadero Delphi XE8。

2 个答案:

答案 0 :(得分:1)

这是一个Windows API函数,因此如果要调用它,则必须使用Winapi.Windows

如果您编写跨平台代码,请改为调用UnicodeFromLocaleChars

答案 1 :(得分:0)

它在Windows单元中定义;只需将Windows添加到uses子句;

uses
  Windows;


function StringToWideStringCP(const S: RawByteString; CP: Integer): UnicodeString;
var
  P: PAnsiChar;
  pw: PWideChar;
  I, J: Integer;
begin
  Result := '';
  if S = '' then
    Exit;
  if CP = CP_UTF8 then
  begin
    // UTF8
    Result := UTF8ToUnicodeString(S);
    Exit;
  end;
  P := @S[1];
  I := MultiByteToWideChar(CP, 0, P, Length(S), nil, 0);
  if I <= 0 then
    Exit;
  SetLength(Result, I);
  pw := @Result[1];
  J := MultiByteToWideChar(CP, 0, P, Length(S), pw, I);
  if I <> J then
    SetLength(Result, Min(I, J));
end;


function WideStringToStringCP(const w: UnicodeString; CP: Integer)
  : RawByteString;
var
  P: PWideChar;
  I, J: Integer;
begin
  Result := '';
  if w = '' then
    Exit;
  case CP of
    CP_UTF8:
      begin
        // UTF8
        Result := UTF8Encode(w);
        Exit;
      end;
    CP_UNICODE_LE:
      begin
        // Unicode codepage
        CP := CP_ACP;
      end;
  end;

  P := @w[1];
  I := WideCharToMultibyte(CP, 0, P, Length(w), nil, 0, nil, nil);
  if I <= 0 then
    Exit;
  SetLength(Result, I);
  J := WideCharToMultibyte(CP, 0, P, Length(w), @Result[1], I, nil, nil);
  if I <> J then
    SetLength(Result, Min(I, J));
  SetCodePage(Result, CP, False);
end;