检查字符串是否可以在XE4及更高版本中安全地转换为AnsiString的最简单方法是什么?

Cha*_*ang 4 delphi unicode

在Delphi XE4及更高版本中,我们可以编写如下内容:

function TestAnsiCompatible(const aStr: string): Boolean;
begin
end;
Run Code Online (Sandbox Code Playgroud)

string在Delphi XE4中声明为UnicodeString.它可能包含一个unicode字符串.

如果我们做一些类型转换:

function TestAnsiCompatible(const aStr: string): Boolean;
var a: AnsiString;
begin
  a := aStr;
  Result := a = aStr;
end;
Run Code Online (Sandbox Code Playgroud)

一些编译器警告应该提示:

[dcc32 Warning]: W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
[dcc32 Warning]: W1057 Implicit string cast from 'AnsiString' to 'string'
Run Code Online (Sandbox Code Playgroud)

是否有一个简单而简洁的方法来测试是否aStr与AnsiString完全兼容?或者我们将按字符检查字符:

function TestAnsiCompatible(const aStr: string): Boolean;
var C: Char;
begin
  Result := True;
  for C in aStr do begin
    if C > #127 then begin
      Result := False;
      Break;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

Rem*_*eau 6

你所要做的就是输掉警告:

function TestAnsiCompatible(const aStr: string): Boolean;
var
  a: AnsiString;
begin
  a := AnsiString(aStr);
  Result := String(a) = aStr;
end;
Run Code Online (Sandbox Code Playgroud)

哪个可以简化为:

function TestAnsiCompatible(const aStr: string): Boolean;
begin
  Result := String(AnsiString(aStr)) = aStr;
end;
Run Code Online (Sandbox Code Playgroud)

  • 如果你想确保Ansi数据可以没有任何损失地往返于Unicode,那么是的.需要实际转换.否则,如果您只想知道转换到Ansi是否有损,请尝试调用[`LocaleCharsFromUnicode()`](http://docwiki.embarcadero.com/Libraries/XE4/en/System.LocaleCharsFromUnicode)或[` WideCharToMultiByte()`](http://msdn.microsoft.com/en-us/library/dd374130.aspx),指定`WC_NO_BEST_FIT_CHARS`标志,然后检查`UsedDefaultChar`参数的输出. (2认同)