我有日期/时间格式:
format = '%Y年%b%d日 %H:%M'
致电Time#strftime(format)
(例如Time.now.strftime(format)
会产生:
> Time.now.strftime(format)
=> "2013?Jun20? 11:56"
我在Windows上使用jruby 1.7.2(1.9.3p327)。有没有办法使strftime
与Unicode兼容?
更新
Windows控制台不太适应Unicode,当我只输出格式时,我得到:
> I18n.t :'time.formats.long'
=> "%YÕ╣┤%b%dµùÑ %H:%M"
但至少它是什么。它试图显示Unicode字符,而strftime
只是忽略它:
> I18n.t(:'time.formats.long').encoding
=> #<Encoding:UTF-8>
> Time.now.strftime("").encoding
=> #<Encoding:Windows-1252>
答案 0 :(得分:1)
它是 readline (JRuby附带)问题,一个简单的修复方法是使用选项--noreadline
启动irb(或者在您的〜中添加IRB.conf[:USE_READLINE] = false
/.irbrc)。
C:\ConEmu>jirb
irb(main):001:0> format = '%Y年%b%d日 %H:%M'
=> "%Y?b%d?%H:%M" # Readline cannot handle GBK input here
irb(main):002:0> exit
C:\ConEmu>jirb --noreadline
irb(main):001:0> format = '%Y年%b%d日 %H:%M'
=> "%Y年%b%d日 %H:%M" # without Readline, it works
irb(main):002:0> format.encoding
=> #<Encoding:GBK>
irb(main):003:0> Time.now.strftime(format)
=> "2013??Jun20?? 23:20" # strftime cannot process GBK input here
strftime
使用GBK编码的字符串无法正常运行。因此,在将参数传递给strftime
之前,将参数编码为UTF-8。顺便说一句,strftime返回GBK编码的字符串是一种非常奇怪的行为,无论Encoding.default_internal
如何!
C:\ConEmu>jirb --noreadline
irb(main):001:0> format = '%Y年%b%d日 %H:%M'
=> "%Y年%b%d日 %H:%M"
irb(main):002:0> Time.now.strftime(format.encode('utf-8'))
=> "2013年Jun20日 23:32"
irb(main):003:0> Time.now.strftime(format.encode('utf-8')).encoding
=> #<Encoding:GBK>
irb(main):004:0> Encoding.default_internal = Encoding::UTF_8
=> #<Encoding:UTF-8>
irb(main):005:0> Time.now.strftime(format.encode('utf-8')).encoding
=> #<Encoding:GBK>
我在JRuby下没有Rails环境,所以我无法解决I18n编码问题。
Readline作为JVM字节码类文件提供,因此,您无法轻松修补库。所以它是strftime
。
这是我对JRuby的第一次尝试(我对Ruby的编码问题很感兴趣),但我不认为我会再次接受它即可。
如果您在JVM上找到一些编程语言,可以查看Scala。它更加一致,富有成效和创造性,(与JRuby相比最重要的)在库中更容易出错。
或者如果您对Ruby感兴趣,请在Windows上尝试RailsInstaller,或在虚拟机上的Linux下安装RVM。我确信与JRuby相比,你会发现更少的麻烦,至少减少编码问题。