-1

(我正在尝试使 Internet 上的 SendKeys 代码与扩展字符一起使用。)Sendkeys 是对 VB SendKeys 的模仿。我在 Internet 上看到了几种算法,以及 Delphi 7 附带的一种。我的程序使用它来将击键发送到其他程序,以使数据输入更快、更一致。除了 Ord() 报告的数字超过 255 的字符外,它运行良好。

自从发布这个问题后,我发现 Character Map 报告 Alt+0128 到 Alt+255。事实证明,Ord() 只报告了 26 个这样的字符,看起来是一个 unicode 值。所以我现在有一个丑陋的解决方法,只是将 Ord() 报告的值替换为 Character Map 报告的备用值,较低的值。所以我的 Sendkeys 现在看起来与记事本中的 Ansi 编码兼容。

我希望进行像 AnsiChar() 这样的简单字符转换,但这会产生完全错误的 Ord() 值。

对于所有这些问题,我都使用 Delphi XE2 和 Arial 字体。Windows 字符映射实用程序报告 Alt + 0147 创建了“左双引号”。

这个组合键在 Delphi 控件、记事本和 Word 中提供“字符”。

我所有的互联网研究都说使用 Ord() 来确定字符的数值:

Procedure ShowNumericKeypadCode(ch: Char);
begin
  showmessage('Key code = ' + Format('%4.4d',[Ord(ch)]));
end;

但这会返回 8220,而不是 0178。Alt+8220 在记事本和 Delphi 控件中产生 ∟,但在 Word 中仍然产生“。

这显然与 Ansi 与 Unicode 有关,但我不知道如何在 Delphi 中编写一个返回 0178 而不是 8220 的函数。

iConv 不会有帮助,因为目标是拥有一个独立的程序。谢谢。

4

2 回答 2

0

事实证明,字符映射实用程序会报告从 Alt+0128 到 Alt+0255 的键码,用于您可以通过数字键盘输入的大写 ASCII 字符。它还报告了更多具有十六进制值的 unicode 字符。如果将该值转换为十进制,也可以通过 Alt+数字键盘输入。我从来没有发现为什么 Ord() 报告 unicode 值 8220 但十六进制是 201C 并且字符映射显示它与 0178 相同。我发现在 0128 到 0255 的范围内,只有 26 个字符 Ord( ) 使用 unicode 值而不是高 ASCII 值报告。这允许一个丑陋的解决方法:

 numStr := Format('%4.4d',[Ord(ch)]);
      numStr :=  AnsiReplaceStr (numStr,'8216','0145');  //Convert from Unicode to Ansi to work with Notepad AND Word
      numStr :=  AnsiReplaceStr (numStr,'8217','0146');  
      numStr :=  AnsiReplaceStr (numStr,'8220','0147');  
      numStr :=  AnsiReplaceStr (numStr,'8221','0148');  
      numStr :=  AnsiReplaceStr (numStr,'0381','0141');  
      numStr :=  AnsiReplaceStr (numStr,'8226','0149');  
      numStr :=  AnsiReplaceStr (numStr,'8211','0150');  
      numStr :=  AnsiReplaceStr (numStr,'8364','0128');  
      numStr :=  AnsiReplaceStr (numStr,'8218','0130');  
      numStr :=  AnsiReplaceStr (numStr,'0402','0131');  
      numStr :=  AnsiReplaceStr (numStr,'8222','0132');  
      numStr :=  AnsiReplaceStr (numStr,'8230','0133');  
      numStr :=  AnsiReplaceStr (numStr,'8224','0134');  
      numStr :=  AnsiReplaceStr (numStr,'8225','0135');  
      numStr :=  AnsiReplaceStr (numStr,'0710','0136');  
      numStr :=  AnsiReplaceStr (numStr,'8240','0137');  
      numStr :=  AnsiReplaceStr (numStr,'0352','0138');  
      numStr :=  AnsiReplaceStr (numStr,'8249','0139');  
      numStr :=  AnsiReplaceStr (numStr,'0338','0140');  

      numStr :=  AnsiReplaceStr (numStr,'8212','0151');  
      numStr :=  AnsiReplaceStr (numStr,'0732','0152');  
      numStr :=  AnsiReplaceStr (numStr,'8482','0153');  
      numStr :=  AnsiReplaceStr (numStr,'0353','0154');  
      numStr :=  AnsiReplaceStr (numStr,'0339','0155');  

      numStr :=  AnsiReplaceStr (numStr,'0382','0158');  
      numStr :=  AnsiReplaceStr (numStr,'0376','0159');  

于 2015-04-24T13:55:38.160 回答
0

您也许可以使用(外部)程序iconv,在编码“UTF-8”的字符 0xc286 中提到在“WIN1252”中没有等价物……使用 iconv postgres 转换时会崩溃。那是指可以从GNU Win32网站下载的程序。

给定一个实现iconv,可以像这样将 UTF-8 转换为 ASCII:

iconv -f UTF8 -t US-ASCII//TRANSLIT -o outputfile inputfile

为了进一步讨论,这些可能会有所帮助(有一些关于iconv.dll直接使用的评论):

于 2015-04-19T17:49:38.250 回答