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

Project1

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

[已经解决] 关于RGSS完美不支持中文目录的问题

[复制链接]

Lv4.逐梦者

梦石
2
星屑
6682
在线时间
501 小时
注册时间
2018-3-23
帖子
533

R考场第七期银奖

跳转到指定楼层
1
发表于 2020-4-21 21:02:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 MCCF 于 2020-4-23 11:13 编辑

最近在写一个快速翻译文件名的工具式脚本。思路是把目录下所有文件名打出来,用户只需要对应输入翻译后的文件名即可自动重命名。
然而既然是翻译脚本,自然会遇到很多中文目录……
然后发现RGSS对中文目录的支持是:
RUBY 代码复制
  1. # 中文目录下的内容无法glob出来
  2. Dir["Directory/*"] #=> [正常内容]
  3. Dir["中文目录/*"] #=> []
RUBY 代码复制
  1. # 中文文件/目录使用Dir.foreach得出的文件名为乱码
  2. Dir.foreach("中文目录") do |filename|
  3.   p filename #=> Encoding::UndefinedConversionError
  4. end
RUBY 代码复制
  1. # Dir#each同样乱码
  2. Dir.new("中文目录").each do |filename|
  3.   p filename #=> Encoding::UndefinedConversionError
  4. end
RUBY 代码复制
  1. # 强制编码转换后仍为乱码
  2. Dir.new("中文目录").each do |filename|
  3.   p filename.force_encoding("UTF-8") #=> 仍为乱码
  4. end
所以这个问题是无法解决了嘛……
【更新】另外就是Dir.getwd的问题,得出来的当前目录名也是有乱码的
RUBY 代码复制
  1. Dir.chdir("中文目录")
  2. p Dir.getwd #=> Encoding::UndefinedConversionError
祝好。

Lv3.寻梦者

梦石
0
星屑
4216
在线时间
619 小时
注册时间
2013-4-30
帖子
124
2
发表于 2020-4-21 21:43:06 | 只看该作者
查了一下 stackoverflow ,如以下两个回答所示,这貌似是 Ruby 1.9 的一个通病

https://stackoverflow.com/questi ... -file-names-in-ruby
https://stackoverflow.com/questi ... -on-windows-in-ruby

然后刚刚在RMVA里试了一下,现在的解决方法是这样:
  1. Dir.chdir("中文")
  2. p Dir.glob("*")
复制代码

可以得出正确的目录下的文件列表。

点评

66666  发表于 2020-4-22 08:04
赞爆!感谢!  发表于 2020-4-21 21:44
    
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
2
星屑
6682
在线时间
501 小时
注册时间
2018-3-23
帖子
533

R考场第七期银奖

3
 楼主| 发表于 2020-4-23 11:05:10 | 只看该作者
紧接着我发现Dir.getwd也不支持中文……2333
所以这个有什么办法解决吗……
祝好。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
19423
在线时间
3102 小时
注册时间
2013-1-11
帖子
1291
4
发表于 2020-4-23 12:49:10 | 只看该作者
MCCF 发表于 2020-4-23 11:05
紧接着我发现Dir.getwd也不支持中文……2333
所以这个有什么办法解决吗……

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

Dir.getwd.gb2312_to_utf8 # 试试

点评

关键时刻还是需要大佬帮(bai)(piao)……非常感谢!  发表于 2020-4-23 15:07

评分

参与人数 1星屑 +100 收起 理由
VIPArcher + 100 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 10:54

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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