M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

ThymeleafのTemplateResolverとキャラクターセット

種々の思惑からこのかんThymeleafを使用したコマンドライン・ツールを作っていて、その中で1つ発見した──というか遭遇した問題。

Thymeleafのテンプレート・エンジンは基本的にWebアプリケーションに組み込んで使うことを想定しているけれど、そうでない用途にも使うことができる。その方法についてはすでにこのブログ上でも取り上げている。

しかし例えば異なるOSでも実行可能なJARファイルをつくるという場合、TemplateResolverインターフェースを通じて、次のようにキャラクターセット(エンコーディング)の設定をする必要がある:

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.thymeleaf.templateresolver.TemplateResolver;

(...)

// テンプレート・エンジンをインスタンス化
final TemplateEngine engine = new TemplateEngine();

// テンプレート解決子をインスタンス化
final TemplateResolver resolver = new ClassLoaderTemplateResolver();

// 種々の設定を行う
resolver.setPrefix("...");
resolver.setSuffix("...");
resolver.setTemplateMode("...");
resolver.setCharacterEncoding("utf-8");

// テンプレート解決子をエンジンに設定
engine.setTemplateResolver(resolver);

これを怠ると、例えば「Mac OS X上で開発しているときにはmainクラスを直接指定するかたちでもJARファイルを指定するかたちでもちゃんと動いていたけれど、Windowsで実行するとSAXのエラーが表示される」という事態が発生する。

つまりTemplateResolverはデフォルトではJava VMがデフォルトのキャラクターセットとして指定したものを採用するので、もしテンプレート・ファイルにマルチ・バイト文字が含まれているのであれば、明示的にキャラクターセット(エンコーディング)を指定する必要があるということ。


Spring関連の訳出記事まとめ - M12i.