Вы наткнулись на случай, когда идиома из Pre-Unicode Pascal не должна переводиться напрямую в наиболее визуально схожую идиому в паскале эпохи Unicode.
Во-первых, давайте разберемся со строковыми литералами Unicode.Если вы всегда можете быть уверены, что у вас никогда не будет тела, которое когда-либо будет использовать ваш исходный код с каким-либо инструментом, который может испортить ваши кодировки, тогда вы можете использовать литералы Unicode.Лично я не хотел бы видеть кодовые точки Unicode в строковых литералах в каком-либо из моего кода, по разным причинам, самая веская причина в том, что мой код может быть пересмотрен для интернационализации в какой-то момент, и иметь литералы, которые принадлежат вашему локальному языкуПроникновение в ваш код - еще большая проблема, когда вы используете язык, отличный от тех, которые используют простые символы кодовой страницы Ascii / Ansi.Ваш исходный код будет более читабельным, если вы будете иметь в виду, что ваши акцентированные символы и даже неакцентированные литералы символов будут лучше объявлены, как говорит Джерун, чтобы объявить их в разделе const, вдали от вашего фактического места вкод, который вы используете.
Рассмотрим случай, когда вы используете один и тот же строковый литерал тридцать три раза по всему коду.Почему это должно повторяться вместо константы?И даже если он используется только один раз, не станет ли код более читабельным, если вы объявите вменяемое имя константы?
Итак, сначала вы должны объявить константы, как он показывает.
Во-вторых, функция CharInSet устарела для всех видов использования, кроме тех, для которых она предназначена, для которых вы должны продолжать использоватьНаборы "АнсиЧар".Этот подход больше не рекомендуется в Delphi 2009/2010, и использование массивов буквенных символов Юникода в вашем постоянном разделе было бы более читабельным и более современным.
Я предлагаю вам использоватьJCL StrContainsChars работает и избегает наборов символов, так как вы не можете вообще объявить встроенный набор символов Unicode, язык не позволяет этого.Вместо этого используйте это, и обязательно прокомментируйте это:
implementation
uses
JclStrings;
const
myChar1 = #$2001;
myChar2 = #$2002;
myChar3 = #$2003;
myMatchList1 : Array[0..2] of Char = (myChar1,myChar2,myChar3);
function Match(s:String):Boolean;
begin
result := StrContainsChars( s, myMatchList1,false);
end;
Строковые и символьные литералы плохи, если их код перебирается, особенно символьные или числовые литералы, которые называются «магическими значениями» и их следует избегать.
PS Ваше утверждение отладки показывает, что Ord ('?') Спокойно понижает символ Юникода до символа байтового размера AnsiChar в отладчике.Это поведение является неожиданным и, вероятно, должно войти в систему QC.