2018年2月25日日曜日

JavaServlet で日本語が「?」で表示されたときの直し方

How to fix the Garbled characters in Java Servlet

Eclipse で JavaServlet を作って実行したら文字化けしてしまいました。
そのときの文字化けの原因と直し方をまとめました。


環境

  • Windows 7
  • Internet Explorer 11
  • Eclipse Luna


JavaServlet で文字エンコードを指定する方法

JavaServlet で文字化けを起こさないためには文字エンコードを指定します。
文字エンコードの指定は Web ブラウザーに文字エンコードなどを伝える「ヘッダー」や、画面に表示する「本文」の meta タグなどで出来ます。
ヘッダーの文字エンコードは response.setCharacterEncoding や response.setContentType で指定します。


文字化けが起きた JavaServlet

ヘッダーと本文の両方に文字エンコードを指定したのに文字化けが起きた JavaServlet のソースは次の通りです。


UTF-8 で出力したいのでヘッダーには setCharacterEncoding と setContentType で、本文には meta タグで 指定したつもりですが実行すると下の画像のように日本語が文字化けしました。

blog.fujiu.jp JavaServlet で日本語が ?? で表示されたときの直し方


原因と直し方

原因は doGet メソッドで文字エンコードを指定する前に本文を出力していたためでした。

文字化けした JabavServlert は文字のエンコードを指定する response.setCharacterEncoding や response.setContentType を実行するよりも先に
response.getWriter().append("Served at: ").append(request.getContextPath());
を実行していますが、この response.getWriter() ... が 文字エンコードの指定前に HTML の本文を出力してしまい文字化けの原因となっていました。
response.getWriter() ... の行は Eclipse のウィザードで新規に JSP ファイルを作成するとはじめから記入されているのですが、消さずにコーディングを続けたために残ってしまいました。

response.getWriter() ... の行を response.setContentType ... の次の行に移動して実行した結果が次の通りです。

今回の文字化けは doGet や doPost で最初に response.setCharacterEncoding や response.setContentType で文字エンコードを指定することで直りました。


ブラウザーはどう解釈してるのか確かめる

文字化けするときとしないときとで Internet Explorer の F12 開発者ツールで応答ヘッダーがどう変わるのか見てみました。
文字化けしたときの応答ヘッダーは charset=ISO-8859-1 となっていました。
JavaServlet で本文を先に出力してしまうとヘッダーを正常に出力出来ないようです。
また、文字エンコードを meta タグに指定しても、今回のケースは効果がなかったうようです。

文字化けが直った方法で応答ヘッダーを確認すると charset が指定した通りに変わりました。


関連ブログ

JavaScript でグラフを作る方法 (Chart.js)
JavaScriptをWebコンテンツを見ながらデバッグする [Intenet Explorer] [firefox]
HTMLソースのミスやエラーを素早くチェックする


2018年2月10日土曜日

[Blender] レンダリングの背景を変更する方法

How to change the render background

3次元CG編集ソフト Blender はデフォルトではレンダリングの背景色はグレーです。
この背景色を変更したり画像に差し替えたりする方法を調べてまとめました。
blog.fujiu.jp [Blender] レンダリングの背景を変更する方法


環境

  • Windows 10
  • Blender 2.78


色を変更する場合

Properties エリアの World をクリックし、Horizon Color をクリックするとカラーピッカーで背景色を変更できます。



背景に画像を指定する場合

背景に画像を指定するには、以下の手順でコンポジットノードを追加し Render の設定を変更します。

コンポジットノードの追加は次の通りです。
どのエディターでもいいので Node Editor に切り替えます。

ノードツリータイプを Compositing に設定し、Use Node を選択します。

Alpha Orver と Image のノードを追加し、下の図のように接続します。

Image ノードの Open をクリックして背景に表示したい画像ファイルを選択します。

以上がコンポジットノードの追加です。

Render の設定変更は次の通りです。
Properties ウィンドウの
Render - Shading - Alpha
を Transparent に変更します。
この設定でレンダリングすると Image ノードで設定した画像が背景に表示されます。


参考にしたコンテンツ

3d view - Background image is not displaying in rendered mode - Blender Stack Exchange
https://blender.stackexchange.com/questions/28772/background-image-is-not-displaying-in-rendered-mode


関連ブログ

BlenderのモデルデータをMMDに変換する方法
ゲームのグラフィックや音声を吸い出す方法 (Unity Assets Bundle Extractor)
[Blender] ManuelbastioniLAB でCLIP STUDIO用キャラクターを作る方法
[Blender] マテリアルのテクスチャ画像をまとめてUVに割り当てるスクリプト