查看: 2863|回复: 6

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

[复制链接]
梦石
2
星屑
6767
在线时间
501 小时
注册时间
2018-3-23
回帖
487

R考场第七期银奖

发表于 2020-4-21 21:02:33 | 显示全部楼层 |阅读模式

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

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

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

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

使用道具 举报

梦石
2
星屑
6767
在线时间
501 小时
注册时间
2018-3-23
回帖
487

R考场第七期银奖

 楼主| 发表于 2020-4-23 11:05:10 | 显示全部楼层
紧接着我发现Dir.getwd也不支持中文……2333
所以这个有什么办法解决吗……
祝好。
回复

使用道具 举报

梦石
0
星屑
19426
在线时间
3082 小时
注册时间
2013-1-11
回帖
1207
发表于 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 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部