gpt4 book ai didi

string - Delphi:如何从字符串中获取*真实的* ASCII 代码

转载 作者:行者123 更新时间:2023-12-02 08:21:33 25 4
gpt4 key购买 nike

这让我发疯。我已经花了两天时间将字符串从一种类型转换为另一种类型,但没有成功。

我使用的是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com