世界のやまさ

SEKAI NO YAMASA

IntelliJ の Terminal で文字化けした場合の対処法

IntelliJ で最近開発をしていて、 gradle プラグインがあまりよろしくない挙動をするので、 Terminal を使用して ./gradlew clean build && java -jar launcher/build/libs/launcher-0.1.0.jar こんな感じで実行している。

問題

ところが、 Mac の Terminal ではうまくいくのに、 IntelliJ の Terminal では次のエラーが発生して起動しないことがあった。

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [/MyBatisConfig.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [javax.sql.DataSource]: : Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceInitializer': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement at line 6 of resource URL [file:../database/src/main/resources/data.sql]: INSERT INTO STEP_OPTIONS(value,label) VALUES ('00','������������'), ('01','���������������������������������������������'), ('99','���������'); nested exception is org.h2.jdbc.JdbcSQLException: 列 "LABEL VARCHAR(15) NOT NULL COMMENT STRINGDECODE('\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd')" の値が長過ぎます: "STRINGDECODE('\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd... (45)"

おそらくは文字化けだろうなぁという感じで、 MacIntelliJ のそれぞれの Terminal で locale を実行すると次の通り。

Mac Terminal の locale

%  locale
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL=

IntelliJ Terminal の locale

% locale
LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

ということで、 IntellIJ Terminal の locale が UTF-8 ではなく ANSI C なのが問題。

解決方法

次のコマンドを実行すれば良い。

LANG="`defaults read -g AppleLocale | sed 's/@.*$//g'`.UTF-8"
export LANG

これをターミナルを実行する度に打ち込むのはだるいので、 .bashrc なり .zshrc なり各自の初期化部にぶち込んでおけば良いかなと。

IntelliJ の Terminal を使わなければ良いんだろうけど、いちいちタスクスイッチするの面倒なんで、解決出来てよかった。まる。

Mac Terminal で起こらない理由

おそらく、このオプションが効いているのかなぁと。 IntelliJ のバグではない気がします。

f:id:nnasaki:20150207115158p:plain

参考サイト

システムワイドなロケール設定 ~ Mac OS X (その1) - 彷徨えるフジワラ