И еще один АХТУНГ, еще более фундаментальный!!!
1. Unicode::normalize_* методы некорректно обрабатывают строки с
нулевыми символами (\000), обрезая строку до этого символа!
2. нормализация к NFKC, которую используют многие методы в
unicode_hacks не полностью поддерживает текущий стандарт Unicode, т.е.
не содержит некоторых лигатур (см. вложение UNICODE_TEST).
Библиотека utf8proc
(http://www.flexiguided.de/publications.utf8proc.en.html) работает
существенно быстрее модуля Unicode, и вроде как более корректно.
> Unicode hacks больше не hacks - я вырубил
> форсированную перегрузку функций.
> Полезли баги, и некоторые из них я не
> могу выловить - это просто слишком
> опасно. Посему теперь вместо нативных
> методов String надо пользоваться прокси
> под названием chars (или u для краткости)
Коллеги, поясните, я немного не в теме. Какая в рельсах есть проблема
по работе с UTF8-русским языком? Пока я с ней не столкнулся, но
хотелось бы знать заранее, где грабли.
С уважением,
Павел Васёв
www.rbteam.com
в дополнение:
http://rutils.rubyforge.org/
http://rubyforge.org/projects/icu4r
Pavel A. Vasev wrote:
...
> в дополнение:
> http://rutils.rubyforge.org/
> http://rubyforge.org/projects/icu4r
Илья, а Rutils проблемы не решают?
можно еще тут посмотреть
http://wiki.rubyonrails.com/rails/pages/HowToUseUnicodeStrings
основная идея, что использовать эти методы для русского текста:
String#reverse
String#size
String#index
String#[]
String#downcase
String#capitalize
String#downcase
String#strip, String#rstrip and String#lstrip
String#slice
(и соотв. регулярные выражения.)
прямо вот так напрямую не получится.
на вики странице даются примеры как это решать.
если я правильно понимаю, то решением является плагин от Юлиана:
http://julik.textdriven.com/svn/tools/rails_plugins/unicode_hacks/
но русский должен быть в utf8 кодировке (unicode).
> можно начать отсюда:
> http://live.julik.nl/2005/11/unicode-and-ruby
>
> в дополнение:
> http://rutils.rubyforge.org/
> http://rubyforge.org/projects/icu4r
>
> Pavel A. Vasev wrote:
> ...
>> Коллеги, поясните, я немного не в
>> теме. Какая в рельсах есть проблема
>> по работе с UTF8-русским языком? Пока я
>> с ней не столкнулся, но
>> хотелось бы знать заранее, где грабли.
"текст".length
вот и грабли
Для отдельно взятого Unicode символа - корректно.
Для строк - как минимум в одном случае - некорректно:
$ cat c.rb
s = 'D\u0307\u0328\u0323'.u.unescape.to_s
puts s.to_u.inspect_names
p Unicode::normalize_KC(s)
p s.utf8nfkc
p s.u.norm_KC.to_s
$ ruby -r ./icu4r.so -r ./unicode.so -r .-/utf8proc.so c.rb
<U000044>LATIN CAPITAL LETTER D
<U000307>COMBINING DOT ABOVE
<U000328>COMBINING OGONEK
<U000323>COMBINING DOT BELOW
"D\314\250\314\243\314\207"
"\341\270\214\314\250\314\207"
"\341\270\214\314\250\314\207"
Похоже, есть более тонкие нюансы, как и при upcase/downcase :)
Работают, но не всегда :)
$ ./ruby -Ku -e 'p "вот нифига НЕ РАБОТАЕТ".scan(/\bн[а-я]+\b/iu)'
["нифига"]
$ ./ruby -r icu4r -Ku -e 'p "вот нифига НЕ РАБОТАЕТ".u.scan(/\bн[а-я]+\b/iu)'
[\u043D\u0438\u0444\u0438\u0433\u0430, \u041D\u0415]
$ ./ruby -v
ruby 2.0.0 (Base: Ruby 1.9.0 2006-04-08) [i686-linux]
YARVCore 0.4.0 Rev: 496 (2006-05-05) [opts: ]