Nix のビルド環境には UTF8 が存在しない

Nix のビルドサンドボックスに UTF8 のロケールが存在しない問題とその回避策

公開日時
更新日時

問題

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 を含むロケールをビルド時の依存パッケージとして指定、 $LANGen_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>

正直スタック上のどこに原因があるのかわからないが、まぁ動くし悪い副作用も見られないのでこれで十分だろう。