Project1
标题: 关于RGSS完美不支持中文目录的问题 [打印本页]
作者: MCCF 时间: 2020-4-21 21:02
标题: 关于RGSS完美不支持中文目录的问题
本帖最后由 MCCF 于 2020-4-23 11:13 编辑
最近在写一个快速翻译文件名的工具式脚本。思路是把目录下所有文件名打出来,用户只需要对应输入翻译后的文件名即可自动重命名。
然而既然是翻译脚本,自然会遇到很多中文目录……
然后发现RGSS对中文目录的支持是:
# 中文目录下的内容无法glob出来
Dir["Directory/*"] #=> [正常内容]
Dir["中文目录/*"] #=> []
# 中文目录下的内容无法glob出来
Dir["Directory/*"] #=> [正常内容]
Dir["中文目录/*"] #=> []
# 中文文件/目录使用Dir.foreach得出的文件名为乱码
Dir.foreach("中文目录") do |filename|
p filename #=> Encoding::UndefinedConversionError
end
# 中文文件/目录使用Dir.foreach得出的文件名为乱码
Dir.foreach("中文目录") do |filename|
p filename #=> Encoding::UndefinedConversionError
end
# Dir#each同样乱码
Dir.new("中文目录").each do |filename|
p filename #=> Encoding::UndefinedConversionError
end
# Dir#each同样乱码
Dir.new("中文目录").each do |filename|
p filename #=> Encoding::UndefinedConversionError
end
# 强制编码转换后仍为乱码
Dir.new("中文目录").each do |filename|
p filename.force_encoding("UTF-8") #=> 仍为乱码
end
# 强制编码转换后仍为乱码
Dir.new("中文目录").each do |filename|
p filename.force_encoding("UTF-8") #=> 仍为乱码
end
所以这个问题是无法解决了嘛……
【更新】另外就是Dir.getwd的问题,得出来的当前目录名也是有乱码的
Dir.chdir("中文目录")
p Dir.getwd #=> Encoding::UndefinedConversionError
Dir.chdir("中文目录")
p Dir.getwd #=> Encoding::UndefinedConversionError
作者: zyf722 时间: 2020-4-21 21:43
查了一下 stackoverflow ,如以下两个回答所示,这貌似是 Ruby 1.9 的一个通病
https://stackoverflow.com/questi ... -file-names-in-ruby
https://stackoverflow.com/questi ... -on-windows-in-ruby
然后刚刚在RMVA里试了一下,现在的解决方法是这样:
- Dir.chdir("中文")
- p Dir.glob("*")
复制代码
可以得出正确的目录下的文件列表。
作者: MCCF 时间: 2020-4-23 11:05
紧接着我发现Dir.getwd也不支持中文……2333
所以这个有什么办法解决吗……
作者: 张咚咚 时间: 2020-4-23 12:49
- class String
- CP_ACP = 0
- CP_UTF8 = 65001
- def utf8_to_gb2312
- m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
- w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
- n = 0
- i = m2w.call(CP_UTF8, 0 , self, -1, nil, 0)
- buffer = "\0" * (i*2)
- m2w.call(CP_UTF8, 0 , self, -1, buffer, i)
- i = w2m.call(CP_ACP, 0, buffer, -1, nil, 0, nil, nil)
- result = "\0" * i
- w2m.call(CP_ACP, 0, buffer, -1, result, i, nil, nil)
- result.chop!
- return result
- end
- def gb2312_to_utf8
- m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
- w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
- n = self.size
- i = m2w.call(CP_ACP, 0, self, n+1, nil, 0)
- buffer = "\0" * (i*2)
- m2w.call(CP_ACP, 0, self, n+1, buffer, i)
- i = w2m.call(CP_UTF8, 0, buffer, -1, nil, 0, nil, nil)
- result = "\0" * i
- w2m.call(CP_UTF8, 0, buffer, -1, result, i, nil, nil)
- result.chop!
- return result
- end
- end
复制代码
Dir.getwd.gb2312_to_utf8 # 试试
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |