【发布时间】:2009-05-10 11:09:54
【问题描述】:
密切关注 Ruby 的开发,我了解到详细的字符编码是在 Ruby 1.9 中实现的。我现在的问题是:目前如何使用 Ruby 与以 UTF8 格式存储所有数据的数据库通信?
背景:我参与了一个新项目,其中至少可以选择 Ruby/RoR。但该项目需要依赖国际化字符集(分布在许多国家/地区),最好是 UTF8。
那你是怎么处理的呢?提前致谢。
【问题讨论】:
标签: ruby utf-8 internationalization
密切关注 Ruby 的开发,我了解到详细的字符编码是在 Ruby 1.9 中实现的。我现在的问题是:目前如何使用 Ruby 与以 UTF8 格式存储所有数据的数据库通信?
背景:我参与了一个新项目,其中至少可以选择 Ruby/RoR。但该项目需要依赖国际化字符集(分布在许多国家/地区),最好是 UTF8。
那你是怎么处理的呢?提前致谢。
【问题讨论】:
标签: ruby utf-8 internationalization
Ruby 1.8 可以很好地处理 UTF-8 字符串,以便对字符串进行基本操作。根据您的应用程序的需要,某些操作将无法正常工作或无法按预期工作。
例如:
1) 字符串的大小将为您提供字节,而不是字符,因为尚不支持多字节。但是您需要知道字符串的字符大小吗?
2) 不在字符边界处拆分字符串。但是你需要这个吗?等等。
3) 如果在 Ruby 中排序,排序顺序会很奇怪。使用 db 进行排序的建议是个好主意。
等等。
在从 db 读取数据后重新发布关于排序数据的评论:如前所述,结果可能与用户的期望不符。所以解决方案是对数据库进行排序。无论如何,它通常会更快——数据库旨在对数据进行排序。
总结:我的 Ruby 1.8.6 RoR 应用程序可以在现代浏览器上处理和存储为 UTF-8 的国际 Unicode 字符正常工作。从右到左的语言也可以正常工作。主要问题:确保您的数据库和所有网页都设置为使用 UTF-8。如果您的数据库中已经有一些数据,那么您需要通过转换过程将其更改为 UTF-8。
问候,
拉里
【讨论】:
“Unicode 啊哈!虽然 Rails 一直能够存储和显示 unicode,但截断、反转或获取 UTF-8 字符串的确切长度有点复杂。你需要鬼混自己使用 KCODE,虽然有很多人让它工作,但它并不像您希望的(甚至可能是预期的)那样即插即用。
因此,由于 Ruby 直到明年这个时候才会支持多字节,Rails 1.2 引入了 ActiveSupport::Multibyte 来处理 Unicode 字符串。调用字符串上的 chars 方法以开始使用字符而不是字节。" Click Here for more
【讨论】:
虽然我还没有测试过,但字符编码库(目前处于 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 应用程序中的数据进行多少操作?大多数排序等通常由您的数据库引擎完成。
【讨论】: