RGSS 中转换字符串的编码RGSS 中转换字符串的编码

事实上 RGSS 是个 Ruby 的子集,Ruby 的许多重要特性被 Enterbrain 限制了。与此同时写脚本的时候或多或少会用到编码转换。总算有闲心把这个平时一直用到的代码包装了一下,希望对您有用。事实上实现这个功能的代码很多人都写过了,我的这个版本不过是重构了一下而已。

追加的 String 实例方法

  • iconv(src_encoding, dst_encoding)str
    将自身的副本从 src_encoding 转换为 dst_encoding 并返回。两个 encoding 参数均接受 Windows 代码页数字或脚本中定义的六个 Symbol。
  • u2sstr
    iconv(:UTF8, :System) 的快捷方式。
  • s2ustr
    iconv(:System, :UTF8) 的快捷方式。

脚本

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#==============================================================================
# ■ String(补充定义:编码转换)
#------------------------------------------------------------------------------
#  为字符串追加编码转换的机能。
#==============================================================================
# 来源:https://orzfly.com/html/rgss-string-encoding.html
#==============================================================================
# 参考:
#http://msdn.microsoft.com/en-us/library/windows/desktop/dd319072(v=vs.85).aspx
#http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130(v=vs.85).aspx
#http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
#==============================================================================
class String
#--------------------------------------------------------------------------
# ● 常量定义
#--------------------------------------------------------------------------
MultiByteToWideChar = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
WideCharToMultiByte = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
Codepages = {
:System => 0, :UTF7 => 65000, :UTF8 => 65001,
:S_JIS => 932, :GB2312 => 936, :BIG5 => 950,
}
#--------------------------------------------------------------------------
# ● 伪 iconv 编码转换
#--------------------------------------------------------------------------
# s : 原始编码,可使用 Codepages 中的符号或者直接使用代码页值。
# d : 目标编码,同上。
#--------------------------------------------------------------------------
def iconv s, d
src = s.is_a?(Symbol)? Codepages[s] : s
dest = d.is_a?(Symbol)? Codepages[d] : d
len = MultiByteToWideChar.call src, 0, self, -1, nil, 0
buf = "" * (len * 2)
MultiByteToWideChar.call src, 0, self, -1, buf, buf.size / 2
len = WideCharToMultiByte.call dest, 0, buf, -1, nil, 0, nil, nil
ret = "" * len
WideCharToMultiByte.call dest, 0, buf, -1, ret, ret.size, nil, nil
self.respond_to?(:force_encoding) ?
ret.force_encoding("ASCII-8BIT").delete("x00") :
ret.delete("x00")
end
#--------------------------------------------------------------------------
# ● 快捷方式:从系统代码页转为 UTF-8 编码
#--------------------------------------------------------------------------
def s2u
self.respond_to?(:force_encoding) ?
iconv(:System, :UTF8).force_encoding("utf-8") :
iconv(:System, :UTF8)
end
#--------------------------------------------------------------------------
# ● 快捷方式:从 UTF-8 编码转为系统代码页
#--------------------------------------------------------------------------
def u2s
iconv(:UTF8, :System)
end
end

Version History版本历史

  • 0143959 I18N changes: Add language field to posts
  • 4a8e516 Rename categories: stuff -> data, coding -> tech
  • c1bc9db Fix some formatting & broken links; remove yourls_shorturl, categories and tags
  • 5b93ba5 Remove author & delete some broken posts
  • 1ee024d Import posts from my WordPress blog