Вы не вошли.
Страницы 1


Сейчас делаю перевод одной игрушки, написанной в RPG Maker VX. В этом мейкере встроен скриптовый язык Ruby. При этом для скриптов по-умолчанию включена поддержка UTF-8. Разработчик, для пущей красивости, прикрутил к игре систему расширенного форматирования текста ATS 3.0c. Естественно, и разработчику игры, и разработчику ATS похуй на русский язык, поэтому в скрипте форматирования текста есть следующий косяк:
#получение символа в слове
character = @string[i, 1]
#увеличение отображаемой на экран длины слова на ширину символа в пикселях
@word_width += @bitmap.text_size(character).widthНа первый взгляд всё вроде бы правильно, но... разработчикам Ruby, похоже, тоже похуй на русский язык, поэтому строка у них хранится как набор байт, а не набор символов. В английском языке это никак не влияет на работу, потому что первые 256 символов UTF-8 кодируются одним байтом, но при переходе на русский мы получаем по два байта на символ, причём ширина вычисляется отдельно для каждого!
Общий коктейль пофигизма несколько разбавляют разработчики RPG Maker VX, запилившие в своей программе полноценную поддержку юникода - вычисление длины русской строки выполняется корректно... если она предварительно не разрублена на байты идиотским форматированием.
А теперь внимание! Вопрос залу!
Что вообще в Ruby сделано для работы с юникод-строками? Беглое гугление выводит лишь жалобы пользователей на то, что юникод либо не работает, либо работает криво. В энциклопедии Ruby тоже нихрена про юникод не сказано, но при этом все примеры работы со строками используют именно русский язык в качестве данных. Куды смотреть? Куды бечь? Напоминаю основную задау: корректно разбить массив байт на UТF-8 символы.
Добавлено спустя 56 мин 44 с:
UPD: Решил проблему при помощи костыля. Если у кого есть идеи как это сделать правильно - пишите.
Отредактировано MOP3E (01-06-12 21:24:53)
Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun
Вне форума


$KCODE = "u"или запускаешь интерпретатор так
$ ruby -Ku huypizdadjigurda.rbили в каждый файл явно указываешь
# encoding: utf-8А даже если ничего не работает, пробуем костыли:
Ставишь гем unicode
gem install unicodeПодключаешь его
# encoding: utf-8
require 'unicode'А дальше расшариваешь класс и заменяешь методы
Типа такого:
class String
def downcase
Unicode::downcase self
end
def downcase!
self.replace downcase
end
def upcase
Unicode::upcase self
end
def upcase!
self.replace upcase
end
def capitalize
Unicode::capitalize self
end
def capitalize!
self.replace capitalize
end
endЕсли что - другие методы можно доделать так:
ruby-unicode.rubyforge.org/doc/
И вот еще: "How to use"
require 'unicode'
$KCODE = 'UTF-8' # only used when encoding is not specified.
u = "\352\260\200\353\202\230\353\213\244".to_u
u.length #=> 3
u.to_a #=> [44032, 45208, 45796], array of codepoint
u.inspect #=> <U+AC00><U+B098><U+B2E4>
u.to_s #=> "\352\260\200\353\202\230\353\213\244"
u.encoding = "EUC-KR"
u.to_s #=> "\260\241\263\252\264\331"
u.to_s("UTF-8") #=> "\352\260\200\353\202\230\353\213\244"
u.length #=> 3
u = "\260\241\263\252\264\331".to_u("EUC-KR")
u.inspect #=> <U+AC00><U+B098><U+B2E4>Отредактировано Babusha (01-06-12 15:14:05)
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


Не знаю как в руби, но в детстве меня учили никогда не писать в коде русские символы и комментарии на русском. И за много лет никогда не сталкивался с подобной проблемой. Вобще. Так что руби программистам -ПРЕВЕД!
Отредактировано pavel2403 (01-06-12 14:54:00)
Господа, вы охуели. Все. ©Cэмен
Вне форума


Не знаю как в руби, но в детстве меня учили никогда не писать в коде русские символы и комментарии на русском
. И за много лет никогда не сталкивался с подобной проблемой. Вобще. Так что руби программистам -ПРЕВЕД!
ЫЫЫЫЫ!!!
А сам щас 1С правит
Заматерел! 
Отредактировано selenscy (01-06-12 14:58:54)
База сама по себе сплошной скрипт (с) AleksK
При том, что свежие очевидно работают лучше и исправляют некоторые глюки. А в линуксе они (глюки!!!)ещё и становятся нормальными (c) Журнашлюшка 
Вне форума


или запускаешь интерпретатор так
Babusha, я не знаю, как там запускать интерпретатор с заданными параметрами, он же встроен как скриптовый язык в оболочку для создания игры. $KCODE = "u" попробую, там сейцчас $KCODE = "UTF8".
Не знаю как в руби, но в детстве меня учили никогда не писать в коде русские символы и комментарии на русском. И за много лет никогда не сталкивался с подобной проблемой. Вобще. Так что руби программистам -ПРЕВЕД!
Паша, мимо кассы. Названия из базы данных на экран выводятся нормально, а руби их обрабатывает через жопу, если пытаться посимвольно просматривать.
Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun
Вне форума
pavel2403, эти люди имена переменных русскими буквами записывают! Мне до сих пор кошмары снятся! 
Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©
Вне форума


А сам щас 1С правит Заматерел!
А то! 1С не трожь- наше всйо!!! Это хлеб и зрелища и пр... плюшки. а VB у мну для души. 
Добавлено спустя 01 мин 22 с:
pavel2403, эти люди имена переменных русскими буквами записывают! Мне до сих пор кошмары снятся!
Да за такое убивать надо, из рогатки, в упор!!!
Отредактировано pavel2403 (01-06-12 21:15:07)
Господа, вы охуели. Все. ©Cэмен
Вне форума


В общем, если кому интересно, сделал вот так:
#получение символа в слове
if(@string[i]>127)
character = @string[i, 2]
i += 1
else
character = @string[i, 1]
end
#увеличение отображаемой на экран длины слова на ширину символа в пикселях
@word_width += @bitmap.text_size(character).widthПотому что у русских букв коды первого байта получаются больше 200, а метод Bitmap::width, в отличие от методов класса string, прекрасно понимает юникод.
Хреново, что там в других местах ещё есть форматтеры, в которых содержимое строки анализируется ещё более ебанутыми способами. Например, те, которые испльзуются для вывода на экран описаний квестов или названий предметов. Короче, у руби МНОГО способов работать со строкамии и аффтар макросов задействовал их ВСЕ. Хотя, на мой взгляд, можно было обойтись одним-двумя универсальными способами - как аффтару макросов, так и аффтарам руби.
Отредактировано MOP3E (01-06-12 21:26:42)
Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun
Вне форума


Короче, у руби МНОГО способов работать со строкамии и аффтар макросов задействовал их ВСЕ. Хотя, на мой взгляд, можно было обойтись одним-двумя универсальными способами - как аффтару макросов, так и аффтарам руби.
А ну - назови.
Удовлетворен GNU/Linux (с) Linups_Troolvalds
13-значный пароль, состоящий из одних цифр, ломается за полчаса (с) Rector. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю. (с) Рехтур. Взламывает анусы по ойпи.
Вне форума


А ну - назови.
Щаз уже этот исходник далеко от меня, и доки искать влом, чтобы написать что-то похожее, но в другом форматтере для анализа текста аффтар макроса разбивает оный на массив строк, каждую длиной в 1 символ (читай - 1 байт). Регулярное выражение для этого выглядело вот так: (/./). Вот нахрена это нужно когда строка и так представляет из себя массив байт и у класса string есть метод size, абсолютно аналогичный методу size для массива? Индусский код, билят!
А что касается минимума универсальных способов работы со строками, тот тут достаточно всего трёх функций:
- функция, которая будет вырезать заданное количество символов начиная с заданной позиции в строке;
- функции поиска подстроки в строке;
- функция подсчёта числа символов в строке.
Всё остальное - избыточность, перегружающая исходный код непонятным синтаксисом.
Отредактировано MOP3E (01-06-12 21:54:29)
Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun
Вне форума
Страницы 1
[ Сгенерировано за 0.011 сек, 7 запросов выполнено - Использовано памяти: 1.73 Мбайт (Пик: 1.81 Мбайт) ]