Объявление

Односложные и бессмысленные темы, не несущие полезную нагрузку или не содержащие в себе вопрос, будут удаляться!

#1 01-06-12 12:35:59

MOP3E
Участник
Здесь с 05-10-09
Сообщений: 4,208
Windows 7Firefox 10.0

Недопрограмма на недоязыке

Сейчас делаю перевод одной игрушки, написанной в 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

Вне форума

#2 01-06-12 14:53:21

Babusha
Нехристь
Здесь с 12-03-10
Сообщений: 2,221
Windows 7Chrome 19.0

Re: Недопрограмма на недоязыке

$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. Авторитетный Хакер у себя в классе
Я тебя просто отсюда выпилю.  (с) Рехтур. Взламывает анусы по ойпи.

Вне форума

#3 01-06-12 14:53:33

pavel2403
Разбанен
Откуда: Санкт-Петербург
Здесь с 06-10-09
Сообщений: 1,129
Windows 7Internet Explorer 7.0

Re: Недопрограмма на недоязыке

Не знаю как в руби, но в детстве меня учили никогда не писать в коде русские символы и комментарии на русском. И за много лет никогда не сталкивался с подобной проблемой. Вобще. Так что руби программистам -ПРЕВЕД!

Отредактировано pavel2403 (01-06-12 14:54:00)


Господа, вы охуели. Все. ©Cэмен

Вне форума

#4 01-06-12 14:58:20

selenscy
Участник
Здесь с 28-11-10
Сообщений: 2,570
Windows 7Chrome 19.0

Re: Недопрограмма на недоязыке

pavel2403 пишет:

Не знаю как в руби, но в детстве меня учили никогда не писать в коде русские символы и комментарии на русском  smile . И за много лет никогда не сталкивался с подобной проблемой. Вобще. Так что руби программистам -ПРЕВЕД!

ЫЫЫЫЫ!!!

А сам щас 1С правит  smile  Заматерел!  wink

Отредактировано selenscy (01-06-12 14:58:54)


База сама по себе сплошной скрипт (с) AleksK

При том, что свежие очевидно работают лучше и исправляют некоторые глюки. А в линуксе они (глюки!!!)ещё и становятся нормальными (c) Журнашлюшка smile

Вне форума

#5 01-06-12 15:59:30

MOP3E
Участник
Здесь с 05-10-09
Сообщений: 4,208
Windows 7Firefox 12.0

Re: Недопрограмма на недоязыке

Babusha пишет:

или запускаешь интерпретатор так

Babusha, я не знаю, как там запускать интерпретатор с заданными параметрами, он же встроен как скриптовый язык в оболочку для создания игры. $KCODE = "u" попробую, там сейцчас $KCODE = "UTF8".

pavel2403 пишет:

Не знаю как в руби, но в детстве меня учили никогда не писать в коде русские символы и комментарии на русском. И за много лет никогда не сталкивался с подобной проблемой. Вобще. Так что руби программистам -ПРЕВЕД!

Паша, мимо кассы. Названия из базы данных на экран выводятся нормально, а руби их обрабатывает через жопу, если пытаться посимвольно просматривать.


Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun

Вне форума

#6 01-06-12 16:24:43

Lord_Evil
Master Of Darkness
Откуда: Deepest Pits Of Hell
Здесь с 06-06-10
Сообщений: 1,862
Сайт
LinuxOpera 12.00

Re: Недопрограмма на недоязыке

pavel2403, эти люди имена переменных русскими буквами записывают! Мне до сих пор кошмары снятся! sad


Интеллигент боится лишь одного — касаться темы зла и его корней, потому что справедливо полагает, что здесь его могут сразу выeбaть телеграфным столбом.©

Вне форума

#7 01-06-12 21:12:07

pavel2403
Разбанен
Откуда: Санкт-Петербург
Здесь с 06-10-09
Сообщений: 1,129
Windows XPInternet Explorer 7.0

Re: Недопрограмма на недоязыке

selenscy пишет:

А сам щас 1С правит    Заматерел!

А то! 1С не трожь- наше всйо!!! Это хлеб и зрелища и пр... плюшки. а VB у мну для души. smile

Добавлено спустя 01 мин 22 с:

Lord_Evil пишет:

pavel2403, эти люди имена переменных русскими буквами записывают! Мне до сих пор кошмары снятся!

Да за такое убивать надо, из рогатки, в упор!!!

Отредактировано pavel2403 (01-06-12 21:15:07)


Господа, вы охуели. Все. ©Cэмен

Вне форума

#8 01-06-12 21:19:09

MOP3E
Участник
Здесь с 05-10-09
Сообщений: 4,208
Windows 7Firefox 12.0

Re: Недопрограмма на недоязыке

В общем, если кому интересно, сделал вот так:

#получение символа в слове
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

Вне форума

#9 01-06-12 21:37:10

Babusha
Нехристь
Здесь с 12-03-10
Сообщений: 2,221
Windows 7Chrome 19.0

Re: Недопрограмма на недоязыке

MOP3E пишет:

Короче, у руби МНОГО способов работать со строкамии и аффтар макросов задействовал их ВСЕ. Хотя, на мой взгляд, можно было обойтись одним-двумя универсальными способами - как аффтару макросов, так и аффтарам руби.

А ну - назови.


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

Вне форума

#10 01-06-12 21:45:44

MOP3E
Участник
Здесь с 05-10-09
Сообщений: 4,208
Windows 7Firefox 12.0

Re: Недопрограмма на недоязыке

Babusha пишет:

А ну - назови.

Щаз уже этот исходник далеко от меня, и доки искать влом, чтобы написать что-то похожее, но в другом форматтере для анализа текста аффтар макроса разбивает оный на массив строк, каждую длиной в 1 символ (читай - 1 байт). Регулярное выражение для этого выглядело вот так: (/./). Вот нахрена это нужно когда строка и так представляет из себя массив байт и у класса string есть метод size, абсолютно аналогичный методу size для массива? Индусский код, билят!

А что касается минимума универсальных способов работы со строками, тот тут достаточно всего трёх функций:
- функция, которая будет вырезать заданное количество символов начиная с заданной позиции в строке;
- функции поиска подстроки в строке;
- функция подсчёта числа символов в строке.

Всё остальное - избыточность, перегружающая исходный код непонятным синтаксисом.

Отредактировано MOP3E (01-06-12 21:54:29)


Я не игрушечный. Я, б*я, коллекционный! (с) Duke Nukem Forever
Я не специалист по [вставить название]. Мне главное концептуально решить задачу! (с) АхаRu.
Линукс - это альтернативная ОС о которой известно, что она не является ОС ну вот просто ни разу. (с) Linups_Troolvalds.
А с какого такого перепугу пользователей линукса должно быть больше 1%? (с) petrun

Вне форума

Сейчас в этой теме пользователей: 0, гостей: 1
[Bot] ClaudeBot

Подвал форума

Под управлением FluxBB
Модифицировал Visman

[ Сгенерировано за 0.011 сек, 7 запросов выполнено - Использовано памяти: 1.73 Мбайт (Пик: 1.81 Мбайт) ]