(我正试图通过互联网使SendKeys代码使用扩展字符。)Sendkeys是对VB SendKeys的模仿。我在互联网上看到了几种算法,加上Delphi 7附带的算法。我的程序使用它将键击发送到其他程序,以使数据输入更快更一致。除了Ord()报告的数字超过255的字符外,它的效果很好。
自发布此问题以来,我发现字符映射报告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.在记事本和Delphi控件中,Alt + 8220会产生,,但它仍会在Word中产生。
这显然与Ansi和Unicode有关,但我无法弄清楚如何在Delphi中编写一个将返回0178而不是8220的函数。
iConv将没有用,因为我们的目标是拥有一个独立的计划。感谢。
答案 0 :(得分:0)
您可以使用 character 0xc286 of encoding “UTF-8” has no equivalent in “WIN1252”…On conversion with iconv postgres restore crashes 中提到的(外部)程序iconv
。这是指可以从GNU Win32网站下载的程序。
鉴于iconv
的实现,可以将UTF-8转换为ASCII,如下所示:
iconv -f UTF8 -t US-ASCII//TRANSLIT -o outputfile inputfile
有待进一步讨论,这些可能有所帮助(有关于直接使用iconv.dll
的一些评论):
答案 1 :(得分:0)
事实证明,字符映射实用程序会将Alt + 0128到Alt + 0255的键代码报告给您可以通过数字键盘输入的上部ASCII字符。它还报告了更多具有十六进制值的unicode字符。如果将该值转换为十进制,也可以通过Alt +数字键盘输入。我从未发现为什么Ord()报告的unicode值为8220但是十六进制是201C而字符映射显示与0178相同的字符。我发现在0128到0255的范围之外,Ord只有26个字符( )使用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');