我有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上我成功地得到了相同的字符串。但设备无法显示西里尔。
2条答案
按热度按时间xdnvmnnf1#
Delphi
string
在所有平台上都是以UTF-16编码的。除非您在应用之外与非Unicode数据交互,否则无需转换。也就是说,如果有一个字节数组是用特定的字符集编码的,那么可以使用 Delphi 的
TEncoding.Convert()
方法将其转换为另一个字符集。(如果与标准支持的字符集不同- ANSI、ASCII、UTF-7、UTF-8和UTF-16 -它们在TEncoding
中有自己的属性getter)。更新:要以特定字符集编码Unicode字符串,只需调用
TEncoding.GetBytes()
方法,例如:您可以使用
TEncoding.GetString()
将特定字符集中的字节解码回字符串,例如:hzbexzde2#
答案是下一个。 Delphi 柏林10.1使用KOI 8-R和我的设备-cp 1251。因为我想写俄罗斯符号(西里尔),我创建了KOI 8-R和cp 1251的符号匹配表。
因此,我将KOI 8-R中的字符串放入cp 1251中。
简码:
....