2016-02-08 5 views
1

У меня есть программа, написанная в Delphi 4 и пытающаяся преобразовать ее в delphi xe10. Одна часть, которую я не понимаю, такова.Кодирование результатов не работает

Cmd[0] := 2;     // Number of equipment to talk to 
    Cmd[1] := 22;     // My device address 
    Cmd[2] := 0; 
    MResults.Lines.Add('Reciving...'); 
    Refresh(); 

    Srlen := High(RecBuff);        

    Ret := GpListen(@Cmd, @Srlen, @RecBuff);    // gets returned value 
    if CheckRet('GpListen', (Ret and $FF), csBuf) = 0 then 
    begin 
     RecBuff[Srlen] := Chr(0);       // ?? 
     MResults.Lines.Add(RecBuff);    // returned 
     //csBuf := Format('????', [Srlen]); ////?some error?? 
    end; 

Этот вопрос RecBuff (RecBuff: массив [диапазоне 0..9999] из Чар;) Она начинается полный # 0, так как:

enter image description here

, но как только

Ret := gpListen(@cmd, @srlen, @recbuff); 

побежал recbuff теперь выглядит следующим образом:

enter image description here много японский знак. как я могу заставить это правильно закодировать в записной книжке.

+0

Я вставленный изображения для вас. Два совета в следующий раз: 1) Нам не нужны эти большие скриншоты, только секция соответствующих локальных переменных будет делать 2) Никогда не ставьте код в свои вопросы без указания типов переменных (теперь мы должны предположить, какое животное * cmd * является). –

ответ

3

Try изменения

RecBuff:array[0..9999] of Char; 

в

RecBuff:array[0..9999] of AnsiChar; 

и посмотреть, если он работает. Это может вызвать некоторые изменения в других местах кода.

В Delphi 10 символ «Char» является 2-байтовой сущностью (16-разрядный символ, UniCode), в отличие от Delphi 4, где это 1-байтовый объект (8-битный символ, ANSI). Общий формат для обоих компиляторов - это «AnsiChar», который является 8-битным символом.

Возможно, у вас также будут проблемы с переменными STRING, которые теперь заполнены 16-разрядными символами, а не 8-битными символами.

Также - прочитайте The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!), прежде чем идти дальше в своем преобразовании.

+0

Отлично. и спасибо за ссылку, что это преобразование unicode/ansi убивает меня. – user41758

+0

Также см. Документацию по миграции Embarcadero: [Unicode в RAD Studio] (http://docwiki.embarcadero.com/RADStudio/en/Unicode_in_RAD_Studio) –

1

В Сиэтле строки и символы Unicode по умолчанию.

Обмен с устройством обычно осуществляется через буферы Ansi (однобайтовые).

Так использовать AnsiString, AnsiChar, PAnsiChar и т.д.

RecBuff: массив [диапазоне 0..9999] из Анси Char;

Мы уже обсуждали эту проблему here

Смежные вопросы