事实上 RGSS 是个 Ruby 的子集,Ruby 的许多重要特性被 Enterbrain 限制了。与此同时写脚本的时候或多或少会用到编码转换。总算有闲心把这个平时一直用到的代码包装了一下,希望对您有用。事实上实现这个功能的代码很多人都写过了,我的这个版本不过是重构了一下而已。
追加的 String 实例方法
iconv(src_encoding, dst_encoding)
→str
将自身的副本从src_encoding
转换为dst_encoding
并返回。两个encoding
参数均接受 Windows 代码页数字或脚本中定义的六个 Symbol。u2s
→str
iconv(:UTF8, :System)
的快捷方式。s2u
→str
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(补充定义:编码转换) #------------------------------------------------------------------------------ # 为字符串追加编码转换的机能。 #============================================================================== # 来源:http://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 |