身陷囹圄 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条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)