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

标签 string delphi printing bluetooth ascii

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

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

相关文章:

C - 区分整数数组中的 0 和\0

Java Print API - 使用等宽 'Courier New' 字体错误打印空格字符

printing - 如何使用 UVM 实用函数打印整个队列/数组?

c++ - 按大写字母顺序排列字符串 C++

string - 计算字符串中的字符串数?

c# - 从字符串中删除文件类型

string - 如何在Delphi中将浮点值显示为科学参数

delphi - TIdCmdTCPServer 和 TIdCmdTCPClient 应该一起使用吗?

c# - 从循环 C# 添加到数组

delphi - 定期调用 FastMM4 LogAllocationBlocksToFile() 是否会耗尽内存空间?