[Ruby] base64

SoNaR sonar at scli.ru
Thu May 8 11:43:05 MSD 2003


Hello SoNaR,

Thursday, May 8, 2003, 11:37:32 AM, you wrote:

S> Hello Sergei,

S> Thursday, May 8, 2003, 11:12:25 AM, you wrote:

SD>> On Thu, May 08, 2003 at 11:10:59AM +0400, SoNaR wrote:
>>> Hello Sergei,
>>> 
>>> Thursday, May 8, 2003, 10:58:14 AM, you wrote:
>>> 
>>> SD> On Thu, May 08, 2003 at 10:47:01AM +0400, SoNaR wrote:
>>> >> Hello Sergei,
>>> >> 
>>> >> Thursday, May 8, 2003, 10:22:25 AM, you wrote:
>>> >> 
>>> >> SD> On Thu, May 08, 2003 at 09:48:27AM +0400, SoNaR wrote:
>>> >> >> Hello ruby,
>>> >> >> 
>>> >> >>   Как мне перевести строчку 'yuDw4Pfg5eLuLdfl8Orl8fHo/y4' в нормальный
>>> >> >>   читаемый вид?
>>> >> >>   Делаю 'yuDw4Pfg5eLuLdfl8Orl8fHo/y4'.unpack("m")[0]
>>> >> >>   и получаю
>>> >> >>   "\312\340\360\340\367\340\345\342\356-\327\345\360\352\345\361\361\350"
>>> >> >>   Вопрос: как получить из этого русскоязычный текст в кодировке
>>> >> >>   win1251?
>>> >> 
>>> >> SD> Один из вариантов:
>>> >> 
>>> >> SD> #!/usr/bin/env ruby
>>> >> 
>>> >> SD> def win2koi(str)
>>> >> SD>   return
>>> >> SD> str.tr('АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя',
>>> >> SD> 'бвчздецъйклмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС');
>>> >> SD> end;
>>> >> 
>>> >> SD> puts win2koi('yuDw4Pfg5eLuLdfl8Orl8fHo/y4'.unpack("m")[0])
>>> >> 
>>> >> А в результате получаю nil...
>>> 
>>> SD> Хм. Видимо, vim не совсем корректно обошелся с этой строкой, а я не
>>> SD> проконтролировал. Функция win2koi состоит из трех строк, на первой -
>>> SD> определение ее, на второй - собственно тело, на третьей - end. То есть,
>>> SD> выглядеть должно вот так:
>>> 
>>> SD> def win2koi(str)
>>> SD>   str.tr('АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя', 'бвчздецъйклмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС');
>>> SD> end
>>> SD> return, насколько я помню, можно опустить.
>>> 
>>> Все правильно, но ты не учем маленькой мелочи... Входная строка у тебя
>>> вида "\312\340\360\340\367\340\345\342\356-\327\345\360\352\345\361\361\350"
>>> Соотвественно русских букв в ней просто нету!!! А как их получить?
>>> ИМХО это Unicode, но я могу ошибаться.

SD>> Не знаю, как это выглядит под Windows, и что Windows почитает за Unicode,
SD>> но, по-моему, это нифига не уникод, по крайней мере, под Linux у меня. И
SD>> входная строка, судя из твоего письма, не "\(ddd)+", а
SD>> 'yuDw4Pfg5eLuLdfl8Orl8fHo/y4'.

SD>> Вот что у меня получается:

SD>> sergei at dolmatov test/ruby/convert $ cat test.rb
SD>> #!/usr/bin/env ruby

SD>> def win2koi(str)
SD>>   str.tr('АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя', 'бвчздецъйклмнопртуфхжигюыэящшьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭЯЩШЬАС');
SD>> end;

SD>> puts win2koi('yuDw4Pfg5eLuLdfl8Orl8fHo/y4'.unpack("m")[0])
SD>> sergei at dolmatov test/ruby/convert $ ruby test.rb
SD>> Карачаево-Черкесси
SD>> sergei at dolmatov test/ruby/convert $

SD>> Куда делась последняя "я", я не знаю.

SD>> Почему это не может работать под Windows - тоже не знаю.

SD>> Если надо перевести строку из koi в win, то просто поменяй местами строчки
SD>> в win2koi.

S>     Не в этом дело... Я верю, что твоя строчка работает. Но у меня
S>     'yuDw4Pfg5eLuLdfl8Orl8fHo/y4'.unpack("m")[0] дает те самые
S>     "\(ddd)+". А как из числового значения получить символ? Допустим я
S>     хочу получить символ с кодом 200

Проблема решилась... Это была "заслуга" особенностей работы оператора
p и перенос return (если его удалить, то все работает).

-- 
Best regards,
 SoNaR                            mailto:sonar at scli.ru




More information about the Ruby mailing list