1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Windows + Leiningenで日本語の文字化けを起こす原因がJVMだった場合

Last updated at Posted at 2019-11-04

WindowsでClojureを使う際の文字化け

  • Clojureと書くが…実はJVMの話だった(前置き)
  • Windows10 + LeiningenでClojureのAPIを作っていると、 文字コードUTF-8を指定しているはずなのに実際にはShift-JISのままになっていて日本語が文字化けする
  • DockerでMySQL DBを立てたりしてると どっちに原因があるのか戸惑う(余談)

原因がJVM optionsにある場合

今回はコレだった。WindowsでJVMを使っていると良くある?
(javaで起きている様子 https://teratail.com/questions/125729)

要するにJVMは、文字コードを指定しない場合は 環境変数などから得られた文字コードを使うので、Windowsの場合はデフォルト文字コードである 例のShift-JISを選択してしまう…ということらしい。
参考 https://qiita.com/seraphy@github/items/98e2908b63af58ef0032

そんな状態を放置したまま、偶然 API開発で Pedestalhttpjson-bodyインターセプターを利用していたりすると大ダメージを受ける

pedestal.http/json-bodyはレスポンスをJSON変換するついでに ちゃっかり文字コードをUTF-8指定しているので、Shift-JISだろうが何だろうが問答無用でUTF-8として返してしまう(そして文字化けする😇)

JVMの文字コード指定をしてどうにかする

Leiningenを使っている場合は、 project.cljにjvm-options :jvm-optsを追加することでJVM optionsを指定できる。
参考 https://stackoverflow.com/questions/25461955/leiningen-project-program-cant-output-non-ascii-string-in-windows

※ そしてこの参考リンクでは書き方が間違っている😇
たとえば :jvm-opts ["-Dfile.encoding" "UTF-8"]と書こうとすると java.nio.charset.IllegalCharsetNameExceptionを引き起こす。
正しくは :jvm-opts ["-Dfile.encoding=UTF-8"]

今回はJVMがUTF-8を使っていなかった(Shift-JISだった)ことが原因だったので、 :jvm-opts ["-Dfile.encoding=UTF-8"]を加えてファイルエンコーディングをUTF-8にすることで解決。

まとめ

  • Shift-JISじゃね?と思ったらJVMが原因のこともある
  • Leiningenなら project.clj:jvm-opts ["-Dfile.encoding=UTF-8"]追加

※ 別解として ~/.lein/profiles.clj (ドキュメント)に {:user {:jvm-opts ["-Dfile.encoding=UTF-8"]}}と書いても良さそう(自分1人で使ってチームメンバーに影響を与えない運用とかするならそっちのが良さそう)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?