2013-06-03 12 views
5

Istnieje kilka sposobów można porównać ciągi w nowoczesnym Delphi (powiedzmy 2010-XE3):Jaka jest różnica między funkcjami porównywania ciągów znaków Delphi?

  • '< =' operator, który postanawia UStrCmp/LStrCmp
  • CompareStr
  • AnsiCompareStr

Czy ktoś może podać (lub wskazać) opis tych metod w zasadzie?

Do tej pory doszedłem do wniosku, że AnsiCompareStr wywołuje funkcję CompareString w systemie Windows, co jest porównaniem "tekstowym" (tzn. Uwzględnia kombinację znaków Unicode itp.). Simple CompareStr nie robi tego i wydaje się, że zamiast tego robi porównanie binarne.

Jaka jest różnica między CompareStr i UStrCmp? Między UStrCmp a LStrCmp? Czy oni wszyscy dają identyczne wyniki? Czy te wyniki zmieniają się między wersjami Delphi?

Pytam, ponieważ potrzebuję porównania, które zawsze da takie same wyniki, więc indeksy w aplikacji zbudowanej z jedną wersją Delphi pozostają spójne z kodem zbudowanym z innym.

Odpowiedz

7

AnsiCompareStr jest określona jako biorąc pod uwagę locale, i powinien wrócić identyczne wyniki, niezależnie od wersji Delphi, ale może zwracać różne wyniki na podstawie wersji i/lub ustawień systemu Windows .. CompareStr jest czystym porównanie binarne: „Operacja porównanie jest w oparciu o 16-bitową wartość porządkową każdego znaku i nie ma wpływu na bieżące ustawienia regionalne "(w przypadku przeciążenia CompareStr(const S1, S2: string)). UStrCmp używa również czystego porównania binarnego: "Ciągi są porównywane zgodnie z wartościami porządkowymi, które składają się na znaki tworzące ciąg znaków." Więc nie powinno być żadnej różnicy między tymi dwoma. Sposób, w jaki zwracają wynik, jest inny, więc potrzebne są dwie implementacje (choć byłoby możliwe, aby jeden polegał na drugim).

odniesieniu do różnic między LStrCmp i UStrCmp, LStrCmp wykonuje AnsiString s, UStrCmp wykonuje UnicodeString s. Całkowicie możliwe jest, że dwa znaki (powiedzmy A i B) są uporządkowane na stronie kodowej "ANSI" jako A < B, ale są uporządkowane w Unicode jako A> B. Powinieneś prawie zawsze używać porównania odpowiedniego dla danych ty masz.

Powiązane problemy