Delphi 柏林10.1 OS X应用解码西里尔文以写入hardDevice

6yoyoihd  于 2023-03-01  发布在  其他
关注(0)|答案(2)|浏览(109)

我有Delphi应用程序,我需要为OSX重写它。这个应用程序写入/读取数据到/从HID设备。
当我尝试从mac写字符串时遇到了问题。
下面是我正在写的代码行(来自windows上的调试器):'Н о в ы й к о м п л е к с 1',这个很好用。同时,如果从调试器复制这个到某个地方,它就变成了'Iîâêêé êïëëåêñ1'。设备显示它是用西里尔写的。这没关系。
当我尝试在OS X上重复这些步骤时,设备显示不可读的符号。但如果我从Windows示例中硬编码'Iîâêêêëëåêñ1',它又可以了。
给点提示。
如何在Windows上
部分代码:

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

s:= AnsiToUtf8(ReplaceNull(s));

下面是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;

我把这个字符串放到Tstringlist然后保存到文件:

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

其他程序读取此列表,然后写入设备:

Progs:= TStringList.Create();

Progs.LoadFromFile(****);

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

然后将其写入设备。
所以这行字看起来是这样的:

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

在Mac上我成功地得到了相同的字符串。但设备无法显示西里尔。

xdnvmnnf

xdnvmnnf1#

Delphi string在所有平台上都是以UTF-16编码的。除非您在应用之外与非Unicode数据交互,否则无需转换。
也就是说,如果有一个字节数组是用特定的字符集编码的,那么可以使用 Delphi 的TEncoding.Convert()方法将其转换为另一个字符集。(如果与标准支持的字符集不同- ANSI、ASCII、UTF-7、UTF-8和UTF-16 -它们在TEncoding中有自己的属性getter)。

var
  SrcEnc, DstEnc: TEncoding;
  SrcBytes, ConvertedBytes: TBytes;
begin
  SrcBytes := ...; // Cyrillic encoded bytes
  SrcEnc := TEncoding.GetEncoding('Cyrillic'); // or whatever the real name is...
  try
    DstEnc := TEncoding.GetEncoding('Windows-1251');
    try
      ConvertedBytes := TEncoding.Convert(SrcEnc, DstEnc, SrcBytes);
    finally
      DstEnc.Free;
    end;
  finally
    SrcEnc.Free;
  end;
  // use ConvertedBytes as needed...
end;

更新:要以特定字符集编码Unicode字符串,只需调用TEncoding.GetBytes()方法,例如:

s := 'Новый комлекс 1';
Enc := TEncoding.GetEncoding('Windows-1251');
try
  bytes := Enc.GetBytes(s);
finally
  Enc.Free;
end;
s := 'Новый комлекс 1';
bytes := TEncoding.UTF8.GetBytes(s);

您可以使用TEncoding.GetString()将特定字符集中的字节解码回字符串,例如:

bytes := ...; // Windows-1251 encoded bytes
Enc := TEncoding.GetEncoding('Windows-1251');
try
  s := Enc.GetString(bytes);
finally
  Enc.Free;
end;
bytes := ...; // UTF-8 encoded bytes
s := TEncoding.UTF8.GetString(bytes);
hzbexzde

hzbexzde2#

答案是下一个。 Delphi 柏林10.1使用KOI 8-R和我的设备-cp 1251。因为我想写俄罗斯符号(西里尔),我创建了KOI 8-R和cp 1251的符号匹配表。
因此,我将KOI 8-R中的字符串放入cp 1251中。
简码:

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;

相关问题