You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RGSS环境下实现文本复制到剪贴板的编码问题求助

RGSS(RPG Maker VX ACE)剪贴板复制乱码问题排查与修复

核心问题分析

你遇到的乱码问题,本质是RGSS的老旧Ruby环境与Windows剪贴板API的编码、内存规则不匹配导致的,常见触发点包括:

  • 未满足CF_UNICODETEXT(13)格式的硬性要求:必须是UTF-16LE编码+双空字符结尾(宽字符串终止符)
  • 剪贴板操作流程不规范:未严格遵循「打开→清空→分配内存→写入→设置数据→关闭」的顺序
  • 内存分配/写入逻辑错误:未按宽字符的字节数(每字符2字节)分配内存,或写入时未正确映射指针

修正后的实现代码

以下是符合Windows剪贴板规范的RGSS代码,直接调用Win32API完成无乱码复制:

# 声明所需Windows API函数
OpenClipboard = Win32API.new('user32', 'OpenClipboard', ['L'], 'I')
EmptyClipboard = Win32API.new('user32', 'EmptyClipboard', [], 'I')
GlobalAlloc = Win32API.new('kernel32', 'GlobalAlloc', ['I', 'L'], 'L')
GlobalLock = Win32API.new('kernel32', 'GlobalLock', ['L'], 'L')
GlobalUnlock = Win32API.new('kernel32', 'GlobalUnlock', ['L'], 'I')
SetClipboardData = Win32API.new('user32', 'SetClipboardData', ['I', 'L'], 'L')
CloseClipboard = Win32API.new('user32', 'CloseClipboard', [], 'I')
RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', ['L', 'P', 'L'], 'V')

def copy_to_clipboard(text)
  # 转换为UTF-16LE并添加宽字符串终止符(双空字符)
  utf16_content = text.encode('UTF-16LE') + "\x00\x00"
  total_bytes = utf16_content.bytesize

  # 打开剪贴板(参数0表示当前窗口句柄)
  return false unless OpenClipboard.call(0) != 0

  # 清空剪贴板旧数据
  EmptyClipboard.call

  # 分配全局内存:GMEM_MOVEABLE(允许系统移动内存)+ GMEM_ZEROINIT(初始化内存)
  memory_handle = GlobalAlloc.call(0x0042, total_bytes)
  if memory_handle != 0
    # 锁定内存获取写入指针
    memory_ptr = GlobalLock.call(memory_handle)
    if memory_ptr != 0
      # 将UTF-16LE数据写入内存
      RtlMoveMemory.call(memory_ptr, utf16_content, total_bytes)
      GlobalUnlock.call(memory_handle)
      # 设置剪贴板数据为CF_UNICODETEXT格式
      SetClipboardData.call(13, memory_handle)
    end
  end

  # 必须关闭剪贴板,否则其他程序无法访问
  CloseClipboard.call
  true
end

# 使用示例
copy_to_clipboard("测试剪贴板复制功能")

关键排查点验证

  1. 终止符检查:之前的代码是否遗漏了\x00\x00?Windows宽字符串要求双空字符结尾,缺少会导致读取时乱码或截断。
  2. 内存大小验证:分配的内存必须是UTF-16LE文本的字节数(不是字符数),每个中/英文字符占2字节,加上终止符的2字节。
  3. 流程合规性:是否严格按「打开→清空→写入→关闭」执行?跳过任意一步都会导致数据写入失败或异常。
  4. API参数匹配:GlobalAlloc的标志是否为0x0042?这个组合是剪贴板要求的可移动内存+初始化,用其他标志可能导致内存无法被剪贴板识别。

内容的提问来源于stack exchange,提问作者MauroG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:13:15