xmpp4r/xmpp4r-simple учим русскому

Обычно как только сделаешь простейший клиент XMPP через используя гем xmpp4r начинается трабла с русским языком, а точнее со всеми кодировками != ASCII. Т.е. все прекрасно работает до тех пор пока не появится текст не на английском.

Если в коде включен отладчик и код выглядит примерно так:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#coding: utf-8
require 'rubygems'
require 'xmpp4r-simple'
 
include Jabber
Jabber::debug = true
 
jabber = Jabber::Simple.new('login@server.com', 'pass')
loop do
   messages = jabber.received_messages
   #jabber.status(:away,'lets chat')
   messages.each do |message|
     body = message.body #if message.type == :chat
     puts '>'+body
     jabber.deliver(message.from, 'Re:'+body)
   end#each
   sleep 1
end#loop

То и вылетит ошибка примерно такая:

1
2
3
4
5
6
7
8
9
10
11
12
REXML::ParseException #<Encoding::CompatibilityError: incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string)>
    /usr/local/rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/rexml/source.rb:214:in `match'
    /usr/local/rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/rexml/source.rb:214:in `match'
    /usr/local/rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:369:in `pull'
    /usr/local/rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/rexml/parsers/sax2parser.rb:92:in `parse'
    /usr/local/rvm/gems/ruby-1.9.2-p180/gems/xmpp4r-0.5/lib/xmpp4r/streamparser.rb:79:in `parse'
    /usr/local/rvm/gems/ruby-1.9.2-p180/gems/xmpp4r-0.5/lib/xmpp4r/stream.rb:75:in `block in start'
    ...
    Exception parsing
    Line:
    Position: 0
    Last 80 unconsumed characters:

Лечится она еще проще чем предыдущая.
Открываем тот самый /usr/local/rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/rexml/source.rb, находим строку с номером 214 (я там в файле уже понавставлял несколько лишних строчек, поэтому номер может несущественно отличатся):

211
212
213
214
215
216
...
def match( pattern, cons=false )
      rv = pattern.match(@buffer)
      @buffer = $' if cons and rv
      while !rv and @source
...

И приводим этот кусок к виду:

211
212
213
214
215
216
...
def match( pattern, cons=false )
      @buffer=@buffer.force_encoding('utf-8')
      rv = pattern.match(@buffer)
      @buffer = $' if cons and rv
...

Также на всякий случай не помешает вставить в самое начало этого файла строчку:

1
#coding: utf-8

После таких манипуляций у меня все начало корректно работать.

6 Comments to “xmpp4r/xmpp4r-simple учим русскому”

  1. вас пишет:

    спасибо дружище!

  2. Денис пишет:

    Спасибо огромное! Jabber::debug = true теперь буду почаще включать

  3. У меня ошибка пофвляется в

    /Users/maksimduhanov/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/openssl/buffering.rb:322:in `syswrite’

    Сделал замену но н помогло::
    #@wbuffer.force_encoding(Encoding::BINARY)
    @wbuffer=@wbuffer.force_encoding(‘utf-8′)

    Весь файл: http://pastie.org/8525112

    Наверное еще нужно гдето на “приеме” поправить (
    Помогите, пожалуйста!

  4. Ой! А ваше решение помогло! (Когда Debug включил!)

    Спасибо!

  5. [...] гем xmpp4r-simple, ошибки которого были замечены тут и [...]

Leave a Reply to собственный способ отправки сообщений в ActionMailer « по стопам webkill'а

(обязательно)

(обязательно)