身陷囹圄 2009-08-20 13:39
浏览 248
已采纳

windows下ruby1.9.1编码问题

[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了?怎么解决?

  • 写回答

4条回答 默认 最新

  • xenocide 2009-08-21 13:06
    关注

    [quote]为什么这样转换后\r\n变成\n\n了?[/quote]
    我也不知道为什么 ……

    似乎下面这两个方法就不会 ……
    [code="ruby"]
    s = File.binread '3.txt' # 这时 s 无编码
    s.encode 'gbk', 'utf-16le', undef: :replace, replace: ''[/code]

    [code="ruby"]

    coding: utf-8

    s = File.open '3.txt', 'rb:utf-16le' do |f| # 原来加个 b 就行了 - -
    f.read
    end # 这时 s 是 utf-8
    puts s.encode 'gbk'[/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效