设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3178|回复: 8
打印 上一主题 下一主题

[已经解决] RMXP读取txt中的中文

[复制链接]

Lv1.梦旅人

梦石
0
星屑
170
在线时间
25 小时
注册时间
2016-6-18
帖子
58
跳转到指定楼层
1
发表于 2017-7-19 16:21:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
举个例子,在游戏根目录下有个Font.txt,玩家可以在里面写下一个字体名称(中文),然后用a=load_data(Font.txt)就会发生TypeError
所以请问如何用RMXP读取txt中的中文?

Lv1.梦旅人

梦石
0
星屑
170
在线时间
25 小时
注册时间
2016-6-18
帖子
58
2
 楼主| 发表于 2017-7-19 16:23:51 | 只看该作者
补充一句,读取RMXP存储的包含中文的txt文件就不会出错,但如果在原来基础上保留txt前面那段乱码,后面写上其它中文,再读取还是会出错
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19334
在线时间
3077 小时
注册时间
2013-1-11
帖子
1288
3
发表于 2017-7-19 17:08:18 | 只看该作者
插入到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

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
170
在线时间
25 小时
注册时间
2016-6-18
帖子
58
4
 楼主| 发表于 2017-7-19 19:44:44 | 只看该作者
张咚咚 发表于 2017-7-19 17:08
插入到main之前

class String

读取出来编码还是不对?

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

QQ截图20170719194138.png

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

QQ截图20170719194203.png

点评

把第一段编码转换的脚本放进main前面去了吗,gb2312_to_utf8  发表于 2017-7-19 20:21
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19334
在线时间
3077 小时
注册时间
2013-1-11
帖子
1288
5
发表于 2017-7-19 20:23:10 | 只看该作者
Project1.7z (182.46 KB, 下载次数: 109)


我测试好像没问题。。。

点评

之前不知道是怎么回事,现在可以了,感谢  发表于 2017-7-19 20:29
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23984
在线时间
3339 小时
注册时间
2011-7-8
帖子
3926

开拓者

6
发表于 2017-7-20 00:55:48 | 只看该作者
是不是你用记事本打开之后,默认以ANSI格式存储了?另存为的时候换成无BOM头的UTF-8试试看,或者用别的软件打开txt。

评分

参与人数 1星屑 +150 收起 理由
RyanBern + 150 我很赞同

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv1.梦旅人

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
帖子
3225
7
发表于 2017-7-20 14:19:35 | 只看该作者
本帖最后由 英顺的马甲 于 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
复制代码

评分

参与人数 1+1 收起 理由
574656549 + 1 认可答案

查看全部评分

本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到[email protected]咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-21 18:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表