Windows jRuby上的strftime的Unicode问题

时间:2013-06-20 11:59:27

标签: ruby-on-rails ruby internationalization jruby strftime

我有日期/时间格式:

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>

1 个答案:

答案 0 :(得分:1)

  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
    
  2. 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>
    
  3. 我在JRuby下没有Rails环境,所以我无法解决I18n编码问题。

    Readline作为JVM字节码类文件提供,因此,您无法轻松修补库。所以它是strftime

    这是我对JRuby的第一次尝试(我对Ruby的编码问题很感兴趣),但我不认为我会再次接受它即可。

    如果您在JVM上找到一些编程语言,可以查看Scala。它更加一致,富有成效和创造性,(与JRuby相比最重要的)在库中更容易出错。

    或者如果您对Ruby感兴趣,请在Windows上尝试RailsInstaller,或在虚拟机上的Linux下安装RVM。我确信与JRuby相比,你会发现更少的麻烦,至少减少编码问题。