Предположим, что к вам в каминную трубу залез Дед Мороз и принес вам Ruby 2.0. Да, у вас нету каминной трубы (и тем более Деда Мороза, но предположим). И в Ruby 2.0 реализован нормальный Unicode, но - backwards compatible. Что вы предпочтете?
Замедление всей обработки строк во всей программе в целом и "магическое" одарение методов String поддержкой Unicode, в стиле mb_func_overload в PHP:
str = "Я ненавижу ASCII" str[0..4] #=> "Я нен"
Вся обработка строк остается такой же как и была (происходит в байтовом выражении), но при необходимости обрабатывать именно буквы (если вы скажете что это одно и то же -- я вас побью) это нужно делать так:
str = "Я ненавижу ASCII" str.characters[0..4] #=> "Я нен"
В варианте 2 естественно правильный софт (а.к.а. Rails) будет использовать правильный синтаксис при обработке строк. В обоих вариантах нужно компилировать расширение для Ruby. Применение новой адресации к строкам работает только при $KCODE == 'UTF8'
Пишите в комментариях какой вариант вам нравится больше.
Важное примечание. Я не Матц и я не буду править исходники Ruby на C. Я пытаюсь сделат meaningful-затычку для этой чудовищной дырки, и мне нужно знать как ее сделать правильнее.
What others said
mblsha
Хотя хотелось бы увидеть реализацию первого, с возможностью экспорта/импорта в бинарные. А для целей производительности сделать какой-нибудь ByteString.
Dragula
Первое. Строка -- это же последовательность символов? Почему тогда для выборки первых четырех нужно сначала выбрать все символы, а потом только выбрать четыре?
Если нужна байтовая строка, то, imho, нужно действительно каст в ByteString или его подобие делать. Например, как-то так:
str.to_bs[0..4] str.bytes[0..4]
Yaroslav
Первое, конечно. Но это ведь фантастика?
nnick
Вариант 1. Но пока эти японаихмать раскачаются...
Хоть я тоже не Матц :), но блин, начинают закрадываться дурные мысли и чесаться руки прикрутить ICU к Ruby самому... и сделать это самым opinionated образом...
Please, somebody, stop me!
enternet
Лучше первое. Зачем вообще что-то переделывать если не стараться сделать это максимально культурно.
clops
Второе!
Julik
Клопс, поскольку тебя можно подозревать в саботаже - обоснуй
MiRacLe
Второе, строго потому, что "старый"(уже существующий) софт, использующий ugly-hack-и, перестанет работать в первом варианте (я что-то не так понял?)
или первый, но с некой настройкой, aka "ini_set('enable_overloading',0)" - опять-таки, чтобы была возможность BC.
Доктор Зойдберг
Если к вам в каминную трубу залез Дед Мороз и принёс вам Ruby 2.0, то это значит, что вы вели себя плохо в этом году. Перестаньте играть в гляделки с вашим компьютером и выйдите на природу, поиграйте в снежки, покатайтесь на лыжах и санках. Физическая разминка укрепит здоровье, а свежий воздух придаст бодрость. С наступающим!
Доктор Зойдберг.
Julik
Всем спасибо, общим голосованием останавливаемся на варианте 1.