Хотя string
теперь является типом Unicode, когда вы указываете длину, вы все равно получаете не * Unicode ShortString
тип. Переменная TestChar
в вашей функции RemoveSpace
является односимвольной строкой, отличной от Unicode. То, что вы должны были использовать все время, это настоящая Char
переменная. Я ожидаю, что вы пришли из мира VB, где односимвольные строки были такими же, как одиночные символы. В Delphi строка не совпадает с символом, поэтому при вызове Copy
вы получаете строку.
В Unicode Delphi эта односимвольная строка преобразуется в строку, отличную от Unicode, и, если в текущей кодовой странице нет представления для этого символа, вы получите знак вопроса. Исправьте это так:
function RemoveSpace(const InStr: string): string;
var
I: Integer;
TestChar: Char;
begin
Result := '';
for I := 1 to Length(InStr) do
begin
TestChar := InStr[I];
if TestChar <> ' ' then
Result := Result + TestChar;
end;
end;
Я избавился от Ans
. Начиная с Turbo Pascal 7, вы можете использовать неявно объявленную переменную Result
вместо того, чтобы объявлять свою собственную, а затем назначать ее для имени функции. Result
доступен для чтения и записи. Кроме того, вам не нужно беспокоиться о вводе нулевой длины. Когда верхняя граница цикла «for-to» меньше нижней границы, цикл просто не запускается, поэтому вам не нужно проверять заранее. Наконец, я использовал скобочные операторы в InStr
для извлечения символа по указанному индексу вместо получения строки длиной в один символ.
Вы говорите, что вы используете Length
и Copy
, очевидно, неправильно, но вы ошибаетесь. Эти функции продолжают отлично работать в Unicode. Они знают, что Char
теперь имеет ширину в два байта, поэтому, если вы вызовете их для UnicodeString
переменных, вы получите правильные символы. Они также продолжают работать с AnsiString
переменными. Фактически, они также работают с переменными find WideString
, даже в старых версиях Delphi.
Основная проблема в вашем коде заключалась в том, что вы сохранили символ Unicode в строковом типе, отличном от Unicode.