String Delphi:如何从字符串中获取*real*ASCII代码

String Delphi:如何从字符串中获取*real*ASCII代码,string,delphi,printing,bluetooth,ascii,String,Delphi,Printing,Bluetooth,Ascii,这让我快发疯了。我已经两天没有成功地将字符串从一种类型转换为另一种类型 我使用的是Delphi Rio,我需要将字符串转换为十六进制或十进制,但字符串包含特殊字符,如áéíóúñ或€ 例如,“á”字符是160(十进制)或A0(十六进制)。 然而,根据字符串类型(ansichar、utf8、widechar…),我得到了225、145、241,但我不知道如何才能得到真正的160值 我需要这个,因为我想向蓝牙打印机发送特殊字符。 如果我发送这个: edit1.text := 'áéíóú€$'; F

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

我使用的是Delphi Rio,我需要将字符串转换为十六进制或十进制,但字符串包含特殊字符,如áéíóúñ或€

例如,“á”字符是160(十进制)或A0(十六进制)。 然而,根据字符串类型(ansichar、utf8、widechar…),我得到了225、145、241,但我不知道如何才能得到真正的160值

我需要这个,因为我想向蓝牙打印机发送特殊字符。 如果我发送这个:

edit1.text := 'áéíóú€$';
FSocket.SendData(TEncoding.ASCII.GetBytes(edit1.Text));
打印机接收此(十六进制):

但是,它应该收到以下信息(十六进制):

这是因为每个字符的ASCII值都不正确(63是“?”字符的ASCII码)

所以。。。如何将真正的ASCII文本发送到打印机? 我怎样才能得到“á”(160)的真正ascii码


请帮忙

首先,对于0x7F以外的字符,不存在实数ASCII码。ASCII仅定义7位字符。当考虑使用8位字符范围的上半部分(0x80->0xFF)中的字符进行文本编码时,编码不再是,而是,有数百种不同的编码方案,所有这些方案都支持不同种类的特殊字符。ANSI编码方案的完全互不兼容是开发和迁移到Unicode的主要驱动因素之一

我们可以从您的预期输出推断出您试图映射到的ANSI代码页为。您的打印机手册可能会在某个地方告诉您这一点,但现在我们假设这是打印机接受的唯一输入。阅读你的手册总是一个好主意——它们将在将来为你省去无尽的烦恼。正如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

中不存在这些字符。这很容易检查。它只有128个值。为了帮助您,我认为您需要告诉我们更多关于打印机真正需要的编码。现在也是您使用Unicode搜索词进行Web搜索的时候了,我想这会让您大开眼界。我们只能希望打印机接受一种常见的Unicode编码。如果没有,我会感到惊讶,因为蓝牙是在Unicode之后很久才发明的!ASCII只有0-1270。没有人发明一种不支持Unicode的蓝牙打印机。实际上,
A0
在所有ANSI代码页中都是不间断的空格。这很可能是旧的DOS OEM字符集。(á->0xA0/160)@DavidHeffernan只是随机挑选了一个。规格->字符集。注意明显的。从左侧的树中,支持的唯一多字节字符集是旧的非unicode JIS日语字符集。这是一个当代的爱普生-更便宜的单元肯定不支持unicode。这就是问题所在。我根本没有用户手册。这是一台来自中国的POS无线打印机。我确实读过很多中文页面:(我会试试你的代码,让你知道我得到了什么。谢谢。顺便说一句@user1461672肯定有一本手册。品牌和型号是什么?GOOJPRT PT-210。我在网上找到了一些其他类似型号和品牌的用户手册。它们似乎都使用相同的ESC/POS命令。问题在于编码本身,而不是与pri的通信nter或要使用的命令。顺便说一句,由于您的答案,我终于可以打印了。这就是我将您的答案标记为解决方案的原因。这是我使用的代码:FSocket.SendData(TEncoding.ascii.GetEncoding(858).GetBytes(edit1.Text));您的代码在最新评论中泄漏。您接受的答案中的代码没有泄漏。您为什么做出这样的选择?您的错误代码表明您仍然认为这是ASCII。不是。请使用答案中的代码。
A0 82 A1 A2 A3 D5 24
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.