AnsiStrIComp在Delphi 2010中无法比较字符串

The*_*ven 3 delphi string unicode delphi-2010

我有点困惑,希望得到启发.

我正在为这个项目使用Delphi 2010,我正在尝试比较2个字符串.

使用以下代码失败

if AnsiStrIComp(PAnsiChar(sCatName), PAnsiChar(CatNode.CatName)) = 0 then...
Run Code Online (Sandbox Code Playgroud)

因为根据调试器,只比较每个字符串的第一个字符(即,sCatName"Automobiles",PAnsiChar(sCatName)"A").

我希望能够比较可能使用不同语言的字符串,例如英语和日语.

在这种情况下,我正在寻找匹配,但我有其他功能用于排序等,我需要知道字符串如何比较(小于,等于,大于).

And*_*and 5

我假设sCatNameCatNode.CatName定义为strings(= UnicodeStrings)?他们应该是.

没有必要将字符串转换为以null结尾的字符串!您(大多数时候)只需要在使用Windows API时进行此操作.

如果要测试两个字符串的相等性,请使用SameStr(S1, S2)(区分大小写的匹配)或SameText(S1, S2)(不区分大小写的匹配),或者仅S1 = S2使用第一种情况.所有三个选项都返回truefalse取决于字符串相等.

如果你想根据字符的序数值得到一个数值(如在排序中),那么使用CompareStr(S1, S2)CompareText(S1, S2).它们返回负整数,零或正整数.

(您可能需要使用Ansi-的功能:AnsiSameStr,AnsiSameText,AnsiCompareStr,和AnsiCompareText;这些功能将使用当前区域设置非.Ansi-功能将接受第三个可选参数,明确指定要使用的语言环境.)

更新

请阅读Remy Lebeau关于问题原因的评论.

  • UnicodeString类型使用UTF-16编码,每个代码单元使用2个字节,每个Unicode字符使用1-2个代码单元(取决于是否使用代理).对于ASCII范围内的Unicode字符,每个代码单元的第二个字节将设置为0.将UnicodeString类型转换为PAnsiChar会将指针视为以空值终止的Ansi字符串,而不是以null结尾的Unicode字符串.所以指针总是在字符串的第二个字节处结束. (4认同)
  • @Andreas:Delphi字符串以空值终止.null终止符不被视为字符串数据的一部分(它不会被Length(字符串)计算),但终结符仍然存在.这是一个PChar类型转换可以简单地返回字符串数据的地址,而不必分配新的内存. (3认同)