Как сделать так, чтобы строки Delphi фиксированной длины использовали широкие символы? - PullRequest
3 голосов
/ 25 января 2011

В Delphi 2010 (и, вероятно, также в D2009) типом строки по умолчанию является UnicodeString.

Однако если мы объявим ...

const
 s  :string = 'Test';
 ss :string[4] = 'Test';

... тогда первая строка s если объявлено как UnicodeString , но второе ss объявлено как AnsiString !

Мы можем проверить это: SizeOf(s[1]); вернет размер 2 и SizeOf(ss[1]);вернет размер 1.

Если я объявлю ...

var
  s  :string;
  ss :string[4];

... чем я хочу, чтобы ss также было типом UnicodeString.

  1. Как я могу сказать Delphi 2010, что обе строки должны быть типа UnicodeString?
  2. Как еще можно объявить, что ss содержит четыре WideChars?Компилятор не будет принимать объявления типов WideString[4] или UnicodeString[4].
  3. Какова цель двух различных объявлений компилятора для одного и того же type name: строка ?

Ответы [ 2 ]

9 голосов
/ 25 января 2011

Ответ на этот вопрос заключается в том, что string[n], то есть ShortString, теперь считается устаревшим типом. Embarcadero принял решение не конвертировать ShortString для поддержки Unicode. Поскольку в Delphi 2 была введена длинная строка, если моя память работает правильно, это кажется мне разумным решением.

Если вам действительно нужны массивы с фиксированной длиной WideChar, вы можете просто объявить array [1..n] of char.

4 голосов
/ 25 января 2011
  1. Нельзя, используя string[4] в качестве типа.Объявление его таким образом автоматически делает его ShortString.

  2. Вместо этого объявите его как массив Char, что сделает его массивом из 4 WideChars.

    Потому что string[4] делает его строкой, содержащей 4 символа.Однако, поскольку WideChars может иметь размер более одного байта, это было бы а) неправильно и б) сбивало с толку.ShortStrings все еще существуют для обратной совместимости и автоматически являются AnsiStrings, потому что они состоят из [x] однобайтовых символов.

...