【问题标题】:What options do exist now to implement UTF8 in Ruby and RoR?现在有哪些选项可以在 Ruby 和 RoR 中实现 UTF8?
【发布时间】:2009-05-10 11:09:54
【问题描述】:

密切关注 Ruby 的开发,我了解到详细的字符编码是在 Ruby 1.9 中实现的。我现在的问题是:目前如何使用 Ruby 与以 UTF8 格式存储所有数据的数据库通信?

背景:我参与了一个新项目,其中至少可以选择 Ruby/RoR。但该项目需要依赖国际化字符集(分布在许多国家/地区),最好是 UTF8。

那你是怎么处理的呢?提前致谢。

【问题讨论】:

    标签: ruby utf-8 internationalization


    【解决方案1】:

    Ruby 1.8 可以很好地处理 UTF-8 字符串,以便对字符串进行基本操作。根据您的应用程序的需要,某些操作将无法正常工作或无法按预期工作。

    例如:

    1) 字符串的大小将为您提供字节,而不是字符,因为尚不支持多字节。但是您需要知道字符串的字符大小吗?

    2) 不在字符边界处拆分字符串。但是你需要这个吗?等等。

    3) 如果在 Ruby 中排序,排序顺序会很奇怪。使用 db 进行排序的建议是个好主意。

    等等。

    在从 db 读取数据后重新发布关于排序数据的评论:如前所述,结果可能与用户的期望不符。所以解决方案是对数据库进行排序。无论如何,它通常会更快——数据库旨在对数据进行排序。

    总结:我的 Ruby 1.8.6 RoR 应用程序可以在现代浏览器上处理和存储为 UTF-8 的国际 Unicode 字符正常工作。从右到左的语言也可以正常工作。主要问题:确保您的数据库和所有网页都设置为使用 UTF-8。如果您的数据库中已经有一些数据,那么您需要通过转换过程将其更改为 UTF-8。

    问候,

    拉里

    【讨论】:

      【解决方案2】:

      “Unicode 啊哈!虽然 Rails 一直能够存储和显示 unicode,但截断、反转或获取 UTF-8 字符串的确切长度有点复杂。你需要鬼混自己使用 KCODE,虽然有很多人让它工作,但它并不像您希望的(甚至可能是预期的)那样即插即用。

      因此,由于 Ruby 直到明年这个时候才会支持多字节,Rails 1.2 引入了 ActiveSupport::Multibyte 来处理 Unicode 字符串。调用字符串上的 chars 方法以开始使用字符而不是字节。" Click Here for more

      【讨论】:

        【解决方案3】:

        虽然我还没有测试过,但字符编码库(目前处于 alpha 版本)向 String 类添加了处理 UTF-8 和其他格式的方法。它在 RubyForge 上的页面是here。它是为 Ruby 1.8 设计的。

        然而,根据我的经验,使用 Ruby 1.8,如果您将数据以 UTF-8 格式存储在数据库中,只要 HTTP 标头中的字符编码是 UTF-8,Ruby 就不会妨碍您。它可能无法对琴弦进行操作,但它不会破坏任何东西。示例:

        file.txt:
        ¡Hola! ¿Como estás? Leí el artículo. ¡Fue muy excellente!
        

        请原谅我可怜的西班牙语;这是我能想到的最好的 Unicode 例子。

        in irb:
        str = File.read("file.txt")
           => "\302\241Hola! \302\277Como est\303\241s? Le\303\255 el art\303\255culo. \302\241Fue muy excellente!\n"
        str += "Foo is equal to bar."
           => "\302\241Hola! \302\277Como est\303\241s? Le\303\255 el art\303\255culo. \302\241Fue muy excellente!\nFoo is equal to bar."
        str = "    " + str + "    "
           => "    \302\241Hola! \302\277Como est\303\241s? Le\303\255 el art\303\255culo. \302\241Fue muy excellente!\nFoo is equal to bar.    "
        str.strip
           => "\302\241Hola! \302\277Como est\303\241s? Le\303\255 el art\303\255culo. \302\241Fue muy excellente!\nFoo is equal to bar."
        

        基本上,它只会将 UTF-8 视为包含奇数字符的 ASCII。如果代码点乱序,它不会按字典顺序排序;但是,它将按代码点排序。示例:

        "\302" <=> "\301"
           => -1
        

        无论如何,您打算对 Rails 应用程序中的数据进行多少操作?大多数排序等通常由您的数据库引擎完成。

        【讨论】:

        • 很抱歉,但正如问题中所述,我对 Ruby 1.9 或 Ruby 2.0 atm 不感兴趣。对数据库的读/写也可能没问题,但是,比如说,之后对这些数据进行排序呢?
        • 能否在 SQL 查询帮助中进行排序?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-09
        • 2014-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-29
        相关资源
        最近更新 更多