在RGSS中使用Win32API时,如果涉及中文及其他特殊字符,就必须在系统代码页及UTF-8间进行必要的转换,否则就会出现乱码。在许许多多的脚本中都可以见到类似的转码脚本,其中大多数年代久远,作者已不可考。我的这个版本只是选取一个常见的版本,简单地进行了些许优化。

#==============================================================================
# ■ EasyConv
#------------------------------------------------------------------------------
#  转码模块。原作者不明,由失落的乐章优化。
#==============================================================================

module EasyConv
  #--------------------------------------------------------------------------
  # ● 常量定义
  #--------------------------------------------------------------------------
  CP_ACP = 0
  CP_UTF8 = 65001
  M2W = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  W2M = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  #--------------------------------------------------------------------------
  # ● 转码
  #--------------------------------------------------------------------------
  def s2u
    len = M2W.call(CP_ACP, 0, self, -1, nil, 0)
    buf = "\0" * (len*2)
    M2W.call(CP_ACP, 0, self, -1, buf, buf.size/2)
    len = W2M.call(CP_UTF8, 0, buf, -1, nil, 0, nil, nil)
    ret = "\0" * len
    W2M.call(CP_UTF8, 0, buf, -1, ret, ret.size, nil, nil)
    ret[-1] = ""
    return ret
  end
  #--------------------------------------------------------------------------
  # ● 转码
  #--------------------------------------------------------------------------
  def u2s
    len = M2W.call(CP_UTF8, 0, self, -1, nil, 0)
    buf = "\0" * (len*2)
    M2W.call(CP_UTF8, 0, self, -1, buf, buf.size/2)
    len = W2M.call(CP_ACP, 0, buf, -1, nil, 0, nil, nil)
    ret = "\0" * len
    W2M.call(CP_ACP, 0, buf, -1, ret, ret.size, nil, nil)
    return ret
  end
end

class String
  include EasyConv
end
分享到: