簡単便利なxml2jsは、パーサーにsax-jsが、ジェネレーターにxmlbuilderが使われている。指定された文字コードさえ適切なら、パーサー側は何もせずに絵文字あたりをパース可能なので問題ない。しかし、ジェネレーター側では適切なオプションが立ってないので、絵文字を含むXMLを作ろうとすると例外で落ちる。

xmlbuilderでは絵文字辺りを扱うためには、create()関数の第4引数でallowSurrogateCharsオプションを有効にしてやる必要がある。

var xml = require('xmlbuilder').create(
  'root',
  {
    encoding: 'UTF-8'
  },
  {},
  {
    allowSurrogateChars: true
  }
).ele('child', '\uD83D\uDC76');
console.log(xml);

これで落ちない。しかし、xml2jsではこのオプションを有効にできないので、自前でジェネレーター関数を作り直す必要がある。

今はxml2jsのBuilder()をパクってお茶を濁しているけど、どうにかしないと今後辛そう。プル・リクエストを投げたいけど、CoffeeScriptという難敵が。