Project1
标题:
RM怎么访问中文目录
[打印本页]
作者:
zh99998
时间:
2009-7-9 14:16
标题:
RM怎么访问中文目录
是目录不是文件
File.open("中文名测试\\新建文本文档.txt") #=>正常
Dir.open("中文名测试") #=>报错:找不到文件
于是……怎么遍历中文目录呢
还有:CopyFileA也不支持中文吗
作者:
神族召唤师
时间:
2009-7-9 14:21
需要改脚本中所有涉及目录的地方,比较麻烦
建议不要改
作者:
zh99998
时间:
2009-7-9 14:26
我是说我自己写脚本访问中文目录啦
作者:
zh99998
时间:
2009-7-9 17:40
三小时了……我顶……
作者:
猫哥哥
时间:
2009-7-9 18:01
为什么非要遍历中文目录……
如果ruby实在不行,就用C/C++写好了做成dll,再用API调用吧
作者:
zh99998
时间:
2009-7-9 18:53
{:3_46:}不会吧……Ruby真的不支持吗……
然后,CopyFileA支持吗
作者:
灼眼的夏娜
时间:
2009-7-9 19:47
据某人说RUBY的一些内部类不支持UTF8= =
作者:
zh99998
时间:
2009-7-9 19:51
><好大的臭虫……
那么,通过转码的方式能行吗,需要转成什么码
作者:
紫苏
时间:
2009-7-10 02:01
本帖最后由 紫苏 于 2009-8-25 23:13 编辑
#==============================================================================
# ■ String
#------------------------------------------------------------------------------
# 字符串类。可处理任意长度的字节串。(追加编码转换的定义)
#==============================================================================
class String
#--------------------------------------------------------------------------
# ● 用来编码 Ruby 字符串、解码 unicode 的 两个 Windows API 函数
#--------------------------------------------------------------------------
@@MultiByteToWideChar = Win32API.new("kernel32", "MultiByteToWideChar", ['I', 'L', 'P', 'I', 'P', 'I'], 'I')
@@WideCharToMultiByte = Win32API.new("kernel32", "WideCharToMultiByte", ['I', 'L', 'P', 'I', 'P', 'I', 'P', 'P'], 'I')
#--------------------------------------------------------------------------
# ● 返回将 Ruby UTF-8 字符串对象(本身)编码为 unicode 后的字符串
#--------------------------------------------------------------------------
def to_unicode
len = @@MultiByteToWideChar.call(65001, 0, self, -1, 0, 0) << 1
buf =" " * len
# 65001: UTF-8 字符集编码(代码页)
@@MultiByteToWideChar.call(65001, 0, self, -1, buf, len)
return buf
end
#--------------------------------------------------------------------------
# ● 返回将编码为 unicode 的字符串对象(本身)解码为 UTF-8 后的字符串
#--------------------------------------------------------------------------
def to_UTF8
len = @@WideCharToMultiByte.call(65001, 0, self, -1, 0, 0, 0, 0)
buf =" " * len
@@WideCharToMultiByte.call(65001, 0, self, -1, buf, len, 0, 0)
# 去掉 '\0' 字符串结束符(因为转换之后仅仅用于 Ruby 字符串)
buf.slice!(-1, 1)
return buf
end
end
FindFirstFile = Win32API.new("kernel32", "FindFirstFileW", "PP", "L")
FindNextFile = Win32API.new("kernel32", "FindNextFileW", "LP", "I")
filenames = []
findFileData = " " * 592
hFindFile = FindFirstFile.call(
"\\\\?\\C:\\TDDOWNLOAD\\孢子完整简体中文版@圣城家园@圣风\\孢子完整简体中文版\\孢子\\*".to_unicode, findFileData)
while FindNextFile.call(hFindFile, findFileData) != 0
filenames.push(findFileData[44, 45 + 260 * 2].to_UTF8)
end
p filenames
复制代码
CopyFileA 是仅支持 ANSI 编码的函数,当然不支持中文,应该用 CopyFileW
作者:
猫哥哥
时间:
2009-7-10 02:44
本帖最后由 猫哥哥 于 2009-7-10 02:46 编辑
现在大家用的windows都是支持宽字符集的。所以直接用CopyFile就行了。
Windows API函数后面带个A的,意思就是仅支持ANSI编码。如果想知道更多,请查阅《windows核心编程》第二章。
作者:
zh99998
时间:
2009-7-10 09:41
谢
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1