Project1

标题: RMXP读取txt中的中文 [打印本页]

作者: 2503542239    时间: 2017-7-19 16:21
标题: RMXP读取txt中的中文
举个例子,在游戏根目录下有个Font.txt,玩家可以在里面写下一个字体名称(中文),然后用a=load_data(Font.txt)就会发生TypeError
所以请问如何用RMXP读取txt中的中文?
作者: 2503542239    时间: 2017-7-19 16:23
补充一句,读取RMXP存储的包含中文的txt文件就不会出错,但如果在原来基础上保留txt前面那段乱码,后面写上其它中文,再读取还是会出错
作者: 张咚咚    时间: 2017-7-19 17:08
插入到main之前

RUBY 代码复制
  1. class String
  2.   CP_ACP = 0
  3.   CP_UTF8 = 65001
  4.   def gb2312_to_utf8
  5.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  6.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  7.     n = self.size
  8.     i = m2w.call(CP_ACP, 0, self, n+1, nil, 0)
  9.     buffer = "\0" * (i*2)
  10.     m2w.call(CP_ACP, 0, self, n+1, buffer, i)
  11.     i = w2m.call(CP_UTF8, 0, buffer, -1, nil, 0, nil, nil)
  12.     result = "\0" * i
  13.     w2m.call(CP_UTF8, 0, buffer, -1, result, i, nil, nil)
  14.     result.chop!
  15.     return result
  16.   end
  17. end


在事件里写上
RUBY 代码复制
  1. File.open("a.txt","r") do |f|
  2.  
  3. s = ""
  4. while line = f.gets
  5. s += line
  6. end
  7.  
  8. print s.gb2312_to_utf8
  9.  
  10. end

作者: 2503542239    时间: 2017-7-19 19:44
张咚咚 发表于 2017-7-19 17:08
插入到main之前

class String

读取出来编码还是不对?

QQ截图20170719194138.png (19.82 KB, 下载次数: 17)

QQ截图20170719194138.png

QQ截图20170719194203.png (2.58 KB, 下载次数: 15)

QQ截图20170719194203.png

作者: 张咚咚    时间: 2017-7-19 20:23
Project1.7z (182.46 KB, 下载次数: 109)


我测试好像没问题。。。


作者: guoxiaomi    时间: 2017-7-20 00:55
是不是你用记事本打开之后,默认以ANSI格式存储了?另存为的时候换成无BOM头的UTF-8试试看,或者用别的软件打开txt。
作者: 英顺的马甲    时间: 2017-7-20 14:19
本帖最后由 英顺的马甲 于 2017-7-20 14:22 编辑

事实上只要保存为UTF8然后手动移除BOM就行了,要不然就把第一行放空然后从第二行开始读取(多功能字幕滚动用的方法)
  1. # 移除BOM的脚本
  2. wchars= File.read("BOM测试.txt").unpack("U*")
  3. wchars.shift if wchars[0] == 0xFEFF
  4. p wchars.pack("U*")
复制代码

下面这是3楼转码的改版,供参考
  1. class String
  2.   CP_ACP = 936 # GB2312
  3.   M2W = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  4.   def gb2312_to_utf8
  5.     n = self.unpack("C*").size # 为了避免任何出错的可能性
  6.     i = M2W.call(CP_ACP, 0, self, n+1, nil, 0)
  7.     buffer = ([0]*(i)).pack("S*")
  8.     M2W.call(CP_ACP, 0, self, n+1, buffer, i)
  9.     # 直接用ruby自带的pack和unpack
  10.     buffer = buffer.unpack("S*")
  11.     buffer.pop
  12.     return buffer.pack("U*")
  13.   end
  14. end
复制代码





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1