[code="ruby"]
#coding:utf-8
fname='中国.txt'
dname='中国'
puts File.exist?(fname) #false
puts Dir.exist?(dname) #false
puts File.exist?(fname.encode('gbk')) #true
puts Dir.exist?(dname.encode('gbk')) #true
File.open(fname,'r'){|f|puts f.readline.encoding} #GBK
File.open(fname.encode('gbk'),'r'){|f|puts f.readline.encoding} #GBK
Dir.foreach(dname.encode('gbk')){|d|puts d} #.和..
Dir.foreach(dname){|d|puts d} #No such file or directory - 中国 (Errno::ENOENT)
Encoding.default_external='utf-8'
puts File.exist?(fname) #false
puts Dir.exist?(dname) #false
puts File.exist?(fname.encode('gbk')) #true
puts Dir.exist?(dname.encode('gbk')) #true
File.open(fname,'r'){|f|puts f.readline.encoding} #UTF-8
File.open(fname.encode('gbk'),'r'){|f|puts f.readline.encoding} #UTF-8
Dir.foreach(dname.encode('gbk')){|d|puts d} #.和..
Dir.foreach(dname){|d|puts d} #No such file or directory - 中国 (Errno::ENOENT)
[/code]
为什么File.exist?(fname)和Dir.exist?(dname)都为false,但是File.open没有异常?
另外,怎么读取并处理UTF-16LE编码的文本?
[b]问题补充:[/b]
首先谢谢night_stalker 的解答!
文件名在中文xp下默认应该GBK编码的,所以我把代码里的字符串编码为gbk就可以找到了。否则,ruby就用我设置的utf-8编码,所以找不到。但是我疑惑的是,同样是找不到[code="ruby"]
puts File.exist?(fname) #false
puts Dir.exist?(dname) #false
[/code]File.open可以顺利通过,但是Dir.open就会异常。
还有night_stalker给的读取utf-16le编码的代码,我运行了为什么不行?
[code="ruby"]
#encoding:utf-8
File.open('a.txt','r:utf-16le'){|f|
f.read
}
#in `initialize': ASCII incompatible encoding needs binmode (ArgumentError)
[/code]
[b]问题补充:[/b]
:idea:
night_stalker的方法确实很好,最后还有个问题希望解答一下:
为什么这样转换后\r\n变成\n\n了?怎么解决?