Delphi 7 : How to copy non-latin text to clipboard?(转换为 Unicode?)

标签 delphi winapi unicode delphi-7

我有这样的代码来将一些文本复制到剪贴板。

uses Clipbrd;

var
  text: string;
begin
  text := 'Some non-latin text, for example Russian: Привет!'

  Clipboard.AsText := text;
end;

Win7-8 操作系统、操作系统区域设置中设置的俄语区域设置(和格式)、Delphi 7。

问题是,只有当我在复制时切换(shift+alt)到俄语键盘布局时,它才有效。否则,它将被粘贴为 "Ïðèâåò!" 而不是 "Привет!"

我该如何解决这个问题?

我认为我需要以某种方式将文本转换为 Unicode 并从 WinAPI 调用 Unicode 剪贴板复制函数?但如何做到这一点呢?

最佳答案

通过您认为合适的任何方式将文本转换为 Unicode。在 Delphi 7 中,通常涉及使用 WideString

将文本编码为 UTF-16 后(例如在 WideString 中),您需要使用 CF_UNICODETEXT 剪贴板调用 SetClipboardData格式。它被 Delphi 包装为全局 Clipboard 对象的 SetAsHandle 方法。

我还没有测试过它,但这个函数应该可以帮助你:

uses
  Windows, Clipbrd;

procedure SetClipboardText(const Text: WideString);
var
  Count: Integer;
  Handle: HGLOBAL;
  Ptr: Pointer;
begin
  Count := (Length(Text)+1)*SizeOf(WideChar);
  Handle := GlobalAlloc(GMEM_MOVEABLE, Count);
  Try
    Win32Check(Handle<>0);
    Ptr := GlobalLock(Handle);
    Win32Check(Assigned(Ptr));
    Move(PWideChar(Text)^, Ptr^, Count);
    GlobalUnlock(Handle);
    Clipboard.SetAsHandle(CF_UNICODETEXT, Handle);
  Except
    GlobalFree(Handle);
    raise;
  End;
end;

关于Delphi 7 : How to copy non-latin text to clipboard?(转换为 Unicode?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21707127/

相关文章:

vba - VBA Winsock无法使用更长的端口长度(sin_port)

c++ - 检查 fopen 不支持的文件名

php - 使用 PHPMailer 发送 unicode 表情符号

delphi - 为什么我在 IDE 中得到了另一个尺寸的组件?

delphi - OpenCV Haar 级联 xml 格式

c++ - 使用 SSPI : How to start? 实现 SSL

python - win32api.keybd_event 停止工作

r - 十六进制代码 (\x) 和 unicode (\u) 字符有什么区别?

delphi - 如何显示十六进制代码字符?

delphi - 从 TAutoObject 返回 TAutoIntfObject 实例