Node.js 和卡卡西的日语音译

Japanese Transliteration in Node.js and Kakasi

我已经为 Kakasi

写了一个小封装

就像下面这样:

Kakasi.prototype.transliterate = function (data) {
            var self = this;
            return new Promise(function (resolve, reject) {

                var args;
                args = [
                    '-i',
                    'euc',
                    '-Ha',
                    '-Ka',
                    '-Ja',
                    '-Ea',
                    '-ka',
                    '-s',
                    '-iutf8',
                    '-outf8'
                ];
                var kakasi = spawn(self._options.bin, args, {});
                console.log( "echo \""+data+"\" | " + kakasi.spawnargs.join(' ') )
                args = [
                    data
                ];
                var echo = spawn('echo', args, {});

                echo.stdout.pipe( kakasi.stdin );
                var res='';
                kakasi.stdout.on('data', function(_data) {
                    var data=new Buffer(_data,'utf-8').toString();
                    res+=data;
                });
                kakasi.stdout.on('end', function(_) {
                    return resolve(res);
                });
                kakasi.on('error', function(error) {
                    return reject(error);
                });

                if (self._options.debug) kakasi.stdout.pipe(process.stdout);

            });
        }//transliterate

此代码基本上执行以下命令

echo "退屈であくびばっかしていた毎日" | kakasi -i euc -Ha -Ka -Ja -Ea -ka -s -iutf8 -outf8

输出taikutsu deakubibakkashiteita mainichi 问题是 javascript 实际上缺少一些输出:

$ node transliterate.js 
echo "退屈であくびばっかしていた毎日" | kakasi -i euc -Ha -Ka -Ja -Ea -ka -s -iutf8 -outf8
----------
deakubibakkashiteita 

输入参数相同,但由于某种原因(编码?)子输出到 stdout 不同。

kakasi.js 代码可用 here

我认为您的词典加载器导致了这个问题。你应该按如下方式翻字典。

process.env.KANWADICTPATH = resolve('./data/kanwadict');
process.env.ITAIJIDICTPATH = resolve('./data/itaijidict');

而不是

process.env.KANWADICTPATH = resolve('./data/itaijidict');
process.env.ITAIJIDICTPATH = resolve('./data/kanwadict');