問題
Pandoc の生成物を Nix のパッケージにしようとしたところコマンドライン引数で渡した日本語がすべて文字化けしていた。
# 再現用 derivation
{
stdenv,
pandoc,
}:
stdenv.mkDerivation {
name = "nix-builder-lang-test";
src = ./.;
buildPhase = ''
pandoc --from markdown --to html --output out.html test.md --standalone --metadata=title:題名
'';
installPhase = ''
mkdir -p $out
cp out.html $out/out.html
'';
nativeBuildInputs = [ pandoc ];
}ls
# default.nix flake.nix test.md
cat test.md
# あああ
nix build
tail -5 result/out.html<h1 class="title">������</h1>
</header>
<p>あああ</p>
</body>
</html>原因
Nix のビルドサンドボックス内にロケールというものが存在しないため。
$LANG も $LC_ALL も空なので、ASCII
外の文字が扱われないものと思われる。
回避策
UTF8 を含むロケールをビルド時の依存パッケージとして指定、
$LANG を en_US.UTF-8 に設定する。
{
stdenv,
pandoc,
+ glibcLocalesUtf8,
}:
stdenv.mkDerivation {
name = "nix-builder-lang-test";
src = ./.;
buildPhase = ''
pandoc --from markdown --to html --output out.html test.md --standalone --metadata=title:題名
'';
installPhase = ''
mkdir -p $out
cp out.html $out/out.html
'';
+
- nativeBuildInputs = [ pandoc ];
+ nativeBuildInputs = [ pandoc glibcLocalesUtf8 ];
+
+ LANG = "en_US.UTF-8";
}nix build
tail -5 result/out.html<h1 class="title">題名</h1>
</header>
<p>あああ</p>
</body>
</html>正直スタック上のどこに原因があるのかわからないが、まぁ動くし悪い副作用も見られないのでこれで十分だろう。