Search code examples
macosdelphiunicodedecodedelphi-10.1-berlin

Delphi Berlin 10.1 OS X app Decode Cyrillic for writing to hardDevice


I have delphi application, I need to rewrite it for OS X. This app writes/reads data to/from HID-device.

I have issues when I'm trying to write string from mac.

Here is the line that I'm writing(from debugger on windows): 'Новый комплекс 1' and this works good. Meanwhile if copy this from debugger to somewhere it becomes 'Íîâûé êîìïëåêñ 1'. Device shows it as it was written, in cyrillic. And that's OK.

When I'm trying to repeat this steps on OS X, device shows unreadable symbols. But if I do hardcode 'Íîâûé êîìïëåêñ 1' from windows example it's OK again.

Give some hints.

How it on Windows

Some code:

 s:= 'Новый комлекс 1'

s:= AnsiToUtf8(ReplaceNull(s));

Here is ReplaceNULL:

function ReplaceNull(const Input: string): string;
var
Index: Integer;
Res: String;
begin
Res:= '';
for Index := 1 to Length(Input) do
begin
if Input[Index] = #0 then
  Res:= Res + #$12
else
  Res:= Res + Input[Index];
end;
 ReplaceNull:= Res;
end;

this string I put to Tstringlist and then save to file:

ProgsList.SaveToFile(Mwork.pathLibs+'stream.ini', TEncoding.UTF8);

Other program read this list and then writes to device:

Progs:= TStringList.Create();

Progs.LoadFromFile(****);

s:= UTF8ToAnsi(stringreplace(Progs.Strings[i], #$12, #0, [rfReplaceAll,   rfIgnoreCase]));

And then write it to device.

So the line which writes seems like this:

"'þ5'#0'ÿ'#$11'Новый комплекс 1'#0'T45/180;55;70;85;90;95;100;T45/180'#0'ÿ'"

On the Mac I successfully get the same string. But device can't show this in Cyrillic.


Solution

  • The answer was next. Delphi Berlin 10.1 uses KOI8-R, and my device - cp1251. As i'd wanted to write russian symbols(Cyrillic) i've created table of matches for symbols from KOI8-R and cp1251.

    So, i take string in KOI8-R make it in cp1251.

    Simple code:

     Dict:=TDictionary<String,String>.Create;
     Dict.Add(#$439,#$E9);//'й'
     Dict.Add(#$44E,#$FE);//'ю'
     Dict.Add(#$430,#$E0);//'а'
    

    ....

    function tkoitocp.getCP1251Code(str:string):string;
    var i:integer; res,key,val:string;  pair:Tpair<String,String>;
    begin
    res:='';
    for i:=1 to length(str) do
     begin
       if dict.ContainsKey(str[i]) then
       begin
          pair:= dict.ExtractPair(str[i]);
    
          res:=res+pair.Value;
          dict.Add(pair.Key,pair.Value);
       end
       else
       res:=res+str[i];
     end;
     Result:=res;
    
    end;