这让我发疯。我已经花了两天时间将字符串从一种类型转换为另一种类型,但没有成功。
我使用的是 Delphi Rio,需要将字符串转换为 HEX 或 DEC,但该字符串包含特殊字符,例如 á é í ó ú ñ 或 €。
例如,“á”字符是 160(十进制)或 A0(十六进制)。 但是,根据字符串类型(ansichar、utf8、widechar...),我得到 225、145、241,但我不知道如何获得真正的 160 值。
我需要这个,因为我想将特殊字符发送到蓝牙打印机。 如果我发送这个:
edit1.text := 'áéíóú€$';
FSocket.SendData(TEncoding.ASCII.GetBytes(edit1.Text));
打印机收到此信息(十六进制):
3F 3F 3F 3F 3F 3F 24
但是,它应该收到此(十六进制):
A0 82 A1 A2 A3 D5 24
这是因为我为每个字符获取了错误的 ASCII 值(63 是“?”字符的 ascii 代码)。
那么...我怎样才能将真正的 ASCII 文本发送到打印机呢? 如何获得“á”(160) 的真正 ascii 代码?
请帮忙!
最佳答案
首先,0x7F 之外的字符不存在真正的 ASCII 代码。 ASCII 仅定义 7 位字符。当考虑使用 8 位字符范围的上半部分 (0x80->0xFF) 中的字符进行文本编码时,编码不再是 ASCII ,但是ANSI ,并且有数百种不同的编码方案,所有这些方案都支持不同种类的特殊字符。 ANSI 编码方案完全相互不兼容是开发和迁移到 Unicode 的主要驱动力之一。
我们可以从您的预期输出中推断出您尝试映射到的 ANSI 代码页是 Code Page 858 。您的打印机手册可能会在某个地方告诉您这一点,但现在我们假设这是打印机接受的唯一输入。 阅读您的手册总是一个好主意 - 它们会为您在未来避免无尽的麻烦。正如 David 指出的,如果您可以使用 Unicode,那么这应该始终是您的首选、最佳选择。
您可以使用 TEncoding
类提取所需的字节,例如:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
LEncoding : TEncoding;
tb : TBytes;
b : Byte;
begin
LEncoding := TEncoding.GetEncoding(858);
try
tb := LEncoding.GetBytes('áéíóú€$');
finally
LEncoding.Free;
end;
for b in tb do Write(IntToHex(b,2) + ' ');
ReadLn;
end.
这会产生输出:
A0 82 A1 A2 A3 D5 24
关于string - Delphi:如何从字符串中获取*真实的* ASCII 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60528925/