@@ -0,0 +1,89 @@
+---
+title: RGSS 中转换字符串的编码
+author: orzFly
+layout: post
+permalink: /html/rgss-string-encoding.html
+yourls_shorturl:
+ - http://miv.im/v0lq
+categories:
+ - Coding
+tags:
+ - encoding
+ - RGSS
+ - RPG Maker
+ - Ruby
+---
+事实上 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)` 的快捷方式。
+
+### 脚本
+
+<!--more-->
+
+<pre class="lang:ruby decode:true ">#==============================================================================
+# ■ 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</pre>
\ No newline at end of file