IRCボットのhubotはISO-2022-JPな環境で使うと文字化けする。なぜなら、hubotはUTF-8を前提として作られているから!
そのため、ZNC等のIRC proxyを介して接続するのが一般的だが、今回はhubotを直接いじって、文字化けを解決する手法を見つけたので紹介する。
#以前、irc.coffeeを改変して対応していたが、それより簡単にできる方法を見つけたので記事にする。
まずは、こちらの記事を参考にインストール。
次に、必要なモジュールをインストール。
$ cd ~/hubot $ npm install jschardet $ npm install iconv
次に、irc.jsのパッチを作成する。
$ cd ~/hubot/node_modules/irc/lib $ cp irc.js irc.js.org $ vi irc.js.patch以下の内容をirc.js.patchとして保存。
--- irc.js.org 2021-10-06 21:44:28.692961900 +0900 +++ irc.js 2021-10-06 22:09:47.822961900 +0900 @@ -30,6 +30,9 @@ var CyclingPingTimer = require('./cyclin var lineDelimiter = new RegExp('\r\n|\r|\n') +var Jschardet = require('jschardet'); +var Iconv = require('iconv').Iconv; + function Client(server, nick, opt) { var self = this; self.opt = { @@ -108,6 +111,11 @@ function Client(server, nick, opt) { } self.addListener('raw', function(message) { + for(i in message.args){ + detectResult = Jschardet.detect(message.args[i]); + iconv = new Iconv(detectResult.encoding,'UTF-8//TRANSLIT//IGNORE'); + message.args[i]=iconv.convert(message.args[i]).toString(); + } var channels = [], channel, nick, @@ -934,7 +942,10 @@ Client.prototype.send = function(command util.log('SEND: ' + args.join(' ')); if (!this.conn.requestedDisconnect) { - this.conn.write(args.join(' ') + '\r\n'); + iconv = new Iconv('UTF-8','ISO-2022-JP//TRANSLIT//IGNORE') + str = iconv.convert(args.join(' ')).toString() +// this.conn.write(args.join(' ') + '\r\n'); + this.conn.write(str + '\r\n'); } };次に、irc.jsにパッチをあてる。
$ patch -p1 irc.js < irc.js.patchこれでhubotを再起動すれば、文字化けは解消しているはず。 notice発言や日本語チャンネル名も問題なくjoin可能!
0 件のコメント :
コメントを投稿