【发布时间】:2014-06-22 14:12:09
【问题描述】:
在 Delphi XE4 及以上版本中,我们可能会这样写:
function TestAnsiCompatible(const aStr: string): Boolean;
begin
end;
string 在 Delphi XE4 中被声明为 UnicodeString。它可能包含一个 unicode 字符串。
如果我们进行一些类型转换:
function TestAnsiCompatible(const aStr: string): Boolean;
var a: AnsiString;
begin
a := aStr;
Result := a = aStr;
end;
一些编译器警告应该提示:
[dcc32 Warning]: W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'
[dcc32 Warning]: W1057 Implicit string cast from 'AnsiString' to 'string'
有没有一种简单明了的方法来测试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;
【问题讨论】:
-
我希望在带有
IS_TEXT_UNICODE_ASCII16标志的IsTextUnicode函数中。运气不好。 -
“逐个字符”功能不是解决问题,而是做不同的事情。
-
你能解释一下为什么你认为#256 很特别吗?
-
我认为不在 #0..#255 范围内的字符是 AnsiChar?如果转换为 AnsiString,XE 会将这些字符转换为
?。 -
@ChauCheeYang - 请记住 ASCII 范围之外的 AnsiChar 值的含义(即 >= #128)取决于代码页。这意味着相同的 UnicodeString 可以无损失地转换为带有(例如)“Latin-1”代码页集的 AnsiString,但可以转换为带有希腊代码页集的 AnsiString。