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可能!