元の回答を編集しています。上記の回答は、Node.js による複雑なソリューションであるため、詳細な説明が必要です。
短い答えは、はい、このコードは機能します。
長い答えは、いいえ、FEFF は utf-8 のバイト オーダー マークではありません。どうやら node は、ファイル内にエンコーディングを書き込むための何らかのショートカットを使用したようです。FEFF は UTF16 リトル エンディアン エンコーディングであり、バイト オーダー マーク ウィキペディアの記事で見ることができ、ファイルを書き込んだ後にバイナリ テキスト エディターで表示することもできます。であることを確認しました。
http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding
どうやら、Node.JS は \ufeff を使用して任意の数の encoding を示します。\ufeff マーカーを受け取り、writeFile の 3 番目のオプション パラメータに基づいて正しいバイト オーダー マークに変換します。エンコーディング文字列で渡す 3 番目のパラメーター。Node.JS はこのエンコーディング文字列を受け取り、\ufeff 固定バイト エンコーディングを実際のエンコーディングのバイト オーダー マークのいずれかに変換します。
UTF-8 の例:
fs.writeFile(someFilename, '\ufeff' + html, { encoding: 'utf8' }, function(err) {
/* The actual byte order mark written to the file is EF BB BF */
}
UTF-16 リトル エンディアンの例:
fs.writeFile(someFilename, '\ufeff' + html, { encoding: 'utf16le' }, function(err) {
/* The actual byte order mark written to the file is FF FE */
}
ご覧のとおり、 \ufeff は、結果として得られるエンコーディングの数を示す単なるマーカーです。ファイルを作成する実際のエンコーディングは、指定されたエンコーディング オプションに直接依存します。文字列内で使用されるマーカーは、ファイルに書き込まれるものとはまったく関係ありません。
この背後にある理由は、バイトオーダーマークを書き込まないことを選択したためであり、UTF-8 の 3 バイトマークは、ディスクに書き込まれる JavaScript 文字列に簡単にエンコードされないためだと思われます。そのため、書き込み時に置換される文字列内のプレースホルダー マークとして UTF16LE BOM を使用しました。