АХТУНГ: unicode_hacks меняется

6 views
Skip to first unread message

Julian 'Julik' Tarkhanov

unread,
Jun 11, 2006, 6:36:02 PM6/11/06
to ror...@googlegroups.com
И еще один ахтунг, на этот раз
фундаментальный!

Unicode hacks больше не hacks - я вырубил
форсированную перегрузку функций.
Полезли баги, и некоторые из них я не
могу выловить - это просто слишком
опасно. Посему теперь вместо нативных
методов String надо пользоваться прокси
под названием chars (или u для краткости)

text = "Некий кусок текста"
text.chars[0..2] #=> "Нек"

Важно помнить, что это просто прокси -
то есть никак "специально" помечать
юникодные строки (как в пайтоне или
перле) не нужно.

Я думал о применении icu4r но его 16-
битные строки в контексте Ruby увы
несколько абсурдны (после всех
конверсий-переконверсий код
становится похож на казнь в стране
существительных).

Кто не имеет юнит-тестов - я не виноват.
--
Julian 'Julik' Tarkhanov
please send all personal mail to
me at julik.nl


Lugovoi Nikolai

unread,
Jun 16, 2006, 2:25:07 AM6/16/06
to ror...@googlegroups.com
2006/6/12, Julian 'Julik' Tarkhanov <julian.t...@gmail.com>:

> И еще один ахтунг, на этот раз
> фундаментальный!
>

И еще один АХТУНГ, еще более фундаментальный!!!

1. Unicode::normalize_* методы некорректно обрабатывают строки с
нулевыми символами (\000), обрезая строку до этого символа!

2. нормализация к NFKC, которую используют многие методы в
unicode_hacks не полностью поддерживает текущий стандарт Unicode, т.е.
не содержит некоторых лигатур (см. вложение UNICODE_TEST).
Библиотека utf8proc
(http://www.flexiguided.de/publications.utf8proc.en.html) работает
существенно быстрее модуля Unicode, и вроде как более корректно.

UNICODE_TEST
utf_case.rb
bm3.rb

Pavel A. Vasev

unread,
Jun 16, 2006, 6:18:50 AM6/16/06
to Julian 'Julik' Tarkhanov
> И еще один ахтунг, на этот раз
> фундаментальный!

> Unicode hacks больше не hacks - я вырубил
> форсированную перегрузку функций.
> Полезли баги, и некоторые из них я не
> могу выловить - это просто слишком
> опасно. Посему теперь вместо нативных
> методов String надо пользоваться прокси
> под названием chars (или u для краткости)

Коллеги, поясните, я немного не в теме. Какая в рельсах есть проблема
по работе с UTF8-русским языком? Пока я с ней не столкнулся, но
хотелось бы знать заранее, где грабли.

С уважением,
Павел Васёв
www.rbteam.com

Ilya

unread,
Jun 16, 2006, 6:40:33 AM6/16/06
to ror...@googlegroups.com
можно начать отсюда:
http://live.julik.nl/2005/11/unicode-and-ruby

в дополнение:
http://rutils.rubyforge.org/
http://rubyforge.org/projects/icu4r

Pavel A. Vasev wrote:
...

Pavel A. Vasev

unread,
Jun 16, 2006, 6:41:21 AM6/16/06
to Ilya
> можно начать отсюда:
> http://live.julik.nl/2005/11/unicode-and-ruby

Илья, а Rutils проблемы не решают?

Ilya

unread,
Jun 16, 2006, 7:06:24 AM6/16/06
to ror...@googlegroups.com
Pavel A. Vasev wrote:
...
> Илья, а 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).

Julian 'Julik' Tarkhanov

unread,
Jun 16, 2006, 8:32:06 AM6/16/06
to ror...@googlegroups.com
Cпасибо за, будем разбираться и бить
ногами ;-) если хочешь - присоединяйся
к разработке
прости что так сурово отзывался об ICU4R
но мне так и не удалось его приручить

Julian 'Julik' Tarkhanov

unread,
Jun 16, 2006, 8:33:44 AM6/16/06
to ror...@googlegroups.com

On 16-jun-2006, at 12:40, Ilya wrote:

> можно начать отсюда:
> http://live.julik.nl/2005/11/unicode-and-ruby
>
> в дополнение:
> http://rutils.rubyforge.org/
> http://rubyforge.org/projects/icu4r
>
> Pavel A. Vasev wrote:
> ...
>> Коллеги, поясните, я немного не в
>> теме. Какая в рельсах есть проблема
>> по работе с UTF8-русским языком? Пока я
>> с ней не столкнулся, но
>> хотелось бы знать заранее, где грабли.

"текст".length
вот и грабли

Julian 'Julik' Tarkhanov

unread,
Jun 16, 2006, 8:41:25 AM6/16/06
to ror...@googlegroups.com

On 16-jun-2006, at 8:25, Lugovoi Nikolai wrote:

Занятно. Только таблички в Unicode gem
устарели на 7 лет - я их обновил.
Попробуй с ними тоже - корректно ли он
нормализует.
unidata.map.zip

Lugovoi Nikolai

unread,
Jun 16, 2006, 9:15:54 AM6/16/06
to ror...@googlegroups.com
2006/6/16, Julian 'Julik' Tarkhanov <julian.t...@gmail.com>:

> Занятно. Только таблички в Unicode gem
> устарели на 7 лет - я их обновил.
> Попробуй с ними тоже - корректно ли он
> нормализует.

Для отдельно взятого 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 :)

Julian 'Julik' Tarkhanov

unread,
Jun 16, 2006, 9:26:49 AM6/16/06
to ror...@googlegroups.com

On 16-jun-2006, at 15:15, Lugovoi Nikolai wrote:

> 2006/6/16, Julian 'Julik' Tarkhanov <julian.t...@gmail.com>:
>> Занятно. Только таблички в Unicode gem
>> устарели на 7 лет - я их обновил.
>> Попробуй с ними тоже - корректно ли он
>> нормализует.
>
> Для отдельно взятого Unicode символа -
> корректно.
> Для строк - как минимум в одном случае
> - некорректно:

Вижу вижу. Тебе выслан инвайт в вики -
пожалуйста помести там
все свои соображения по теме и
присоединяйся к действиям. Тебе нужен
логин в мой сабвершен?

Anton Kovalyov

unread,
Jun 16, 2006, 8:05:57 PM6/16/06
to ror...@googlegroups.com
Насколько я знаю, при $KCODE = 'u'
регулярные выражение, как раз таки, и
работают. Матц ещё и поэтому понять не
может, что от него хотят. Он, как я
понял, реги использует *часто*.

--
Anton Kovalyov, web developer

http://anton.kovalyov.net



Lugovoi Nikolai

unread,
Jun 17, 2006, 3:03:00 AM6/17/06
to ror...@googlegroups.com
2006/6/17, Anton Kovalyov <an...@kovalyov.net>:

>
> Насколько я знаю, при $KCODE = 'u'
> регулярные выражение, как раз таки, и
> работают. Матц ещё и поэтому понять не
> может, что от него хотят. Он, как я
> понял, реги использует *часто*.
>

Работают, но не всегда :)

$ ./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: ]

Макс Лапшин

unread,
Jul 1, 2006, 8:45:50 PM7/1/06
to ror...@googlegroups.com
>
> $ ./ruby -Ku -e 'p "вот нифига НЕ РАБОТАЕТ".scan(/
> \bн[а-я]+\b/iu)'
> ["нифига"]

Мы тут обсуждаем: юникод, не юникод.
Поддержка регулярных выражений.
А тем временем в родном альмаматере,
просто таки оплоте компьютерной
индустрии
страны, кузнице компьютерных кадров
(правда больше .NET), на факультете ВМиК
МГУ
работает вот такое вот чудо:

http://croco.livejournal.com/79825.html?thread=1193681#t1193681


Слава богу, что меня мимо него в свое
время пронесло...

Julian 'Julik' Tarkhanov

unread,
Jul 1, 2006, 9:06:15 PM7/1/06
to ror...@googlegroups.com

On 2-jul-2006, at 2:45, Макс Лапшин wrote:

>>
>> $ ./ruby -Ku -e 'p "вот нифига НЕ РАБОТАЕТ".scan(/
>> \bн[а-я]+\b/iu)'
>> ["нифига"]
>
> Мы тут обсуждаем: юникод, не юникод.
> Поддержка регулярных выражений.
> А тем временем в родном альмаматере,
> просто таки оплоте компьютерной
> индустрии
> страны, кузнице компьютерных кадров
> (правда больше .NET), на факультете ВМиК
> МГУ
> работает вот такое вот чудо:
>
> http://croco.livejournal.com/79825.html?thread=1193681#t1193681

Он еще какой-то набор LISP-подобных
макросов написал на C++.

Короче говоря - я человек маленький и
рисую карандашом, а вместо мышки у
меня ваком. В храмы всяких
вычислительных математик и
энтерпрайзных кластеров я захожу
только по важным делам и веду там себя
тихо ;=) в частности
потому что там водятся такие товарищи

Макс Лапшин

unread,
Jul 1, 2006, 9:26:07 PM7/1/06
to ror...@googlegroups.com
>
> Он еще какой-то набор LISP-подобных
> макросов написал на C++.
>


> Короче говоря - я человек маленький и
> рисую карандашом, а вместо мышки у
> меня ваком. В храмы всяких
> вычислительных математик и
> энтерпрайзных кластеров я захожу
> только по важным делам и веду там себя
> тихо ;=) в частности
> потому что там водятся такие товарищи

Да эти люди ни к энтерпрайзу, ни к
вычислительной математике отношения
не имеют.
Так, сбоку припеку.
Reply all
Reply to author
Forward
0 new messages