- ベストアンサー
文字コードについて(どのファイルをどの文字コードにしてWeb開発を進めていくべきか)
【疑問の背景】 文字コードについて(どのファイルをどの文字コードにしてWeb開発を進めていくべきか) 国際標準で使われているUTF-8で統一しておけば問題はないだろうと思って開発を進めていると・・・ UTF-8は「日本語が2~4バイト」で扱われるという、バイトの扱いが厄介であるため、 できればJavaでのUTF-8で開発は避けたい、だから「Shift-JIS」にしておきたいという話があがり、 各々のファイルにどの文字コードを設定すれば良いのかがわからなくなっている状態です。 いくつかの疑問がでていまして 判る範囲で構いませんので文字コード設定の判断についてのアドバイスいただけませんでしょうか? 【現在の開発文字コード】 HTMLファイル: UTF-8 JSPファイル: UTF-8 Javaファイル(servlet): UTF-8 Javaファイル(Bean): UTF-8 Javaファイル(JSPから出来たサーブレット): UTF-8 データベース: UTF-8 【設定したい今後の予定文字コード】 HTMLファイル: UTF-8 JSPファイル: UTF-8 Javaファイル(servlet): Shift-JIS Javaファイル(Bean): Shift-JIS Javaファイル(JSPから出来たサーブレット): Shift-JIS データベース: UTF-8 【疑問1】 javaファイル(servlet,Bean)をどのコードにすべきかについて 全てS-JISにした方がいいのか、UTF-8にした方がいいのかどうあるべきなのでしょうか? (UTF-8 で 「日本語が2~4バイト」として扱われると、どういった弊害が発生するのでしょうか?) 【疑問2】 javaファイルをS-JISに変える方法について 今はサクラエディターというツールで 名前を付けて保存 → 文字コードセット「Shift-JIS」 → 保存 → ファイル名の文字コードセットの変更完了 今はエクスプローラーから直接フォルダの中にあるファイルを触っている状況なのですが、 eclipseから「ファイルの文字コードセットを変更する方法」はありますでしょうか? 【疑問3】 「Shift-JIS」に設定して開発していく必要性について 既存で「utf-8」で設定されているjavaファイルを、「Shift-JIS」に設定して開発していく必要性はあるのでしょうか? (all in one eclipse 3.4 を入れたとき、デフォルトで「utf-8」でjavaファイルが作られるつくりになっているみたいなのですが・・・) 【疑問4】 javaファイル作成時、「Shift-JIS」の形式でファイルを生成する方法について 現在、javaファイルを作成する場合「utf-8」のコードでjavaファイルが生成されるようになっています。 【自作で作成したjavaファイルの場合】 「サクラエディターを使用して、文字コードセットをShift-JISに変更すれば、ずっとShift-JISのファイルの状態」にすることができました。 しかしここで問題が出たのですが 【JSPファイルから自動生成されたjavaファイル(servlet)の場合】 「サクラエディターを使って、Shift-JISに変更した後に、JSPファイルを編集すると、また“utf-8に戻ってしまう” 状態」です。 現状としては「JavaファイルはShift-JISに統一して欲しい」という要望なので、 JSPから自動生成されたjavaファイルが "utf-8" になってしまいます。 JSPから自動生成されたjavaファイルを "常にShift-JISに設定する" 方法はありますでしょうか? 【環境】 OS ・WindowsXP Pro java開発環境 ・all in one eclipse(3.4) ・TomCat(6.0) ・Java JRE(1.6) ・MySQL(5.0)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
えっと、まず、文字集合とエンコード方式 (もしくはエンコーディング方式) の違いは OK ですか? Windows では UTF-16 のことを指して Unicode と表現することもあるのですが、Unicode は文字集合で、UTF-16 はエンコード方式です。 Unicode という文字集合を扱うために、UTF-8 や UTF-16 といったエンコード方式があります。 Shift_JIS も同様にエンコード方式で、これは JIS X 0208 という文字集合に対応するエンコード方式のひとつです。 で、文字コードというと文字集合とエンコード方式のどちらを言っているのか人によって違ったりするので、あまり使いたくない言葉です。 # 質問者さんは「文字コードのエンコーディング方式」のように使っているところを見ると、文字コードを文字集合の意味で使っているようですね Shift-JIS (正しくは Shift_JIS) や UTF-8 と言っていることから、エンコード方式の話がしたい、という前提で話を進めます。 まず、どの部分のエンコード方式を扱っているかが問題です。 1) .java や .jsp といったソースファイルの話 2) プログラミング言語の内部で扱われる文字列の話 3) Web ブラウザに対して送信する際の話 DB を無視すると、とりあえずこの 3 つが考えられます。 まず 1) ですが、これを UTF-8 で書くか、Shift_JIS で書くか、それとも他のものを使うかは、正直好きにすればいいと思います。 ただし、HTML ファイルや CSS ファイルといったものに関しては、おそらく直接 Web ブラウザに対して送信することになるため、3) と合わせておきます。 次に 2) ですが、これは変更することは出来ません。Java の場合必ず内部では UTF-16 で扱うようになっています。 もしこれをどうしても他のエンコード方式が使いたいとなると、文字列はあきらめてバイト列を文字列見に立てて使用することになるでしょうけど、はっきり言って労力に対する見返りが小さすぎます。 もっと言うと、非現実的です。 ただ、Java の UTF-16 対応は中途半端で、サロゲートペアの扱いには注意が必要となります。 例えば、人間から見ると 1 文字なのに、length() が 2 を返してきたりするということです。 もしかすると、このあたりのことを指して、「バイトの扱いが厄介」と言っているのかもしれません。 もしそうなら、1)、つまりファイルのエンコード方式を変えたところで全く意味はありません。 codepointLength とか codepointAtCodePointIndex といった、サロゲートペアでもうまく扱えるメソッドを使いましょう。 最後に 3) ですが、これは正しく指定すればエンコード方式がなんであろうが問題ないはずです。 で、次に各エンコード方式の問題点を挙げます。 Shift_JIS : Windows では Windows-31J(CP932) という拡張が使用されており、Shift_JIS との互換性が完全ではない。そのため下手すると文字化けを起こす UTF-16 : 可変長のエンコード方式にも関わらす固定長のエンコード方式として扱われている場合が多い。また、Unicode の全ての文字を表すことが出来ない。 UTF-8 : Unicode の全ての文字を表すことができるが、日本語が多いと他のエンコード方式に比べてより多くの容量が必要 このように、どのエンコード方式を使おうが何かしらの問題はあります。 その上で、問題点を認識していない状況で盲目的に「Shift_JIS にしよう!」というのは、後から痛い目を見る確率が高いと言っていいでしょう。 まずは問題点を認識しましょう。話はそれからです。 # あと、ここに書いた情報、鵜呑みにしないでくださいね # 自信なしがあったら迷わずそれにチェックを入れたいくらいです
その他の回答 (2)
- x_jouet_x
- ベストアンサー率68% (162/236)
> javaファイル(servlet,Bean)をどのコードにすべきかについて > UTF-8 で 「日本語が2~4バイト」として扱われると、どういった弊害が発生するのでしょうか? ご存知かと思いますが、JVM内部ではすべての文字列はUnicodeで表現されます。 つまり、ある文字列がShift-JISで書かれていたとしてもJavaのプログラムを実行する際、Shift-JISーUnicodeの文字コード変換が行われます。 それを考えると、「UTF-8 で 「日本語が2~4バイト」として扱われる」という疑問がなぜ生じるのか分かりません・・・。 また、ある一部(質問ではJavaファイル)だけ違う文字コードを使用すると、文字化けが発生する可能性が高くなります。 もちろん文字コードが異なることを注意してコーディングすればいいだけの話ですが…。 文字化け(およびその発生を防ぐ)ために工数を使うぐらいなら全ての文字コードを統一した方がいいように思います。
お礼
すみません。 ご回答ありがとうございます。 >「UTF-8 で 「日本語が2~4バイト」として扱われる」という疑問がなぜ生じるのか分かりません・・・。 ここ、なのですが 「UTF-8で日本語が2~4バイトとして扱われるから注意しないといけない」というそこが既に関係ないということでしょうか? (良く分かっておらず申し訳ありません。) 1.Shift-JIS → Unicode (違うコードから違うコードへ) 2.UTF-8 → UTF-8 (同じコードから同じコードへ) 私としては・・・ 1.は違うコードから違うコードへコード変換しているので、Shift-JISにこそ注意はしないとけいないけれど 2.は同じコードから同じコードへコード変換しているので、意識せずとも良いのではないかなとも思っているのですが・・・ >ある一部(質問ではJavaファイル)だけ違う文字コードを使用すると、文字化けが発生する可能性が高くなります。 事実、Javaファイルだけを違うコードにした場合、 eclipse上で文字化けが発生しており(JSPの部分です) かつ、その上、eclipseでデフォルトでUTF-8で作成されたファイルを、 サクラエディターを使って手直しでShift-JISにしないといけない、という手間がかかっていますので・・・ 本当、UTF-8に全て統一しても問題ないのでしたら 何とか説明してUTF-8で開発を進めることを納得していただきたいのですが・・・ 情けない話ですが、口下手なものでどう説明していいのやらと悩んでいるところでもあるのです(汗)
- bleis
- ベストアンサー率68% (11/16)
> UTF-8は「日本語が2~4バイト」で扱われるという、バイトの扱いが厄介であるため、 > できればJavaでのUTF-8で開発は避けたい、だから「Shift-JIS」にしておきたいという話があがり このような記述があるのに、なぜ > UTF-8 で 「日本語が2~4バイト」として扱われると、どういった弊害が発生するのでしょうか? この疑問が出てくるのでしょうか? その話をした本人に確認を取るのが先でしょう。 個人的には、すべてのエンコーディング方式を合わせておいた方が問題にはまることも少ないと思いますが・・・
お礼
すみません、 どうもありがとうございます。 私に知識がないためなのか 突っ込み方(聞き方)を誤ったのか、私もどうしてなのかが疑問なのです(汗) どう扱いづらいのかについて 再度ちゃんと聞いてみようと思っていたところなのですが・・・ なんというか そういって下さったご本人様も、私も含め、本当にそれでいいのか、不透明な状態でもありまして・・・ 私も文字コードのエンコーディング方式は合わせて置いたほうがいい気がするのですが(例えば、開発がUTF-8だというのならUTF-8で統一するといったような・・・) ただ、そうであった方がいい理由を どうも上手く伝えられないというか、まとまらなくてすみません(--;
お礼
すみません、お礼が遅れて申し訳ありません。 どうも、ありがとうございます。 ●文字集合とエンコード方式について >えっと、まず、文字集合とエンコード方式 (もしくはエンコーディング方式) の違いは OK ですか? すみません。 ここのところがよくかわかってなかったです(--; UTF-8、UTF-16ってあくまで「エンコード方式」であって 文字集合体ではないのですね。 >Shift_JIS も同様にエンコード方式で、これは JIS X 0208 という文字集合に対応するエンコード方式のひとつです。 こちらも同様で Shift-JISというものがそもそも「Shift-JIS」という、日本語を取りか使った文字集合体なのだと想っていました。 ●あれから「UTF-8にするのか、Shift-JISにするのか? 何故バイトが扱い辛いのか?」ということについて再度伺った点について その方がShift-JISにしておいて欲しいというのは、 ひとまずは、今編集しているJavaファイルをSHIFT-JISにしておいて、後でほかのファイルもShift-JISで統一して欲しいということだったようです。 他のものは現在、UTF-8であって、 それを変えなくていいというのは「今変えなくていい」ということであり「後々にはShift-JISで統一化をして欲しい」ということでした。 現在の開発としては 「UTF-8」で開発するべきなのか「Shift-JIS」で開発すべきか という点が確定していないため Shift-JIS限定でとは言わないが、 とにかく文字コードを統一して欲しいということだったようです ●サロゲートペアについて http://www.atmarkit.co.jp/fjava/rensai4/programer06/programer06_1.html 表1 Java言語における文字と文字列 より 「U+0000~U+FFFFの文字セットは、「基本多言語面(BMP)」と呼ばれ、この範囲の文字はchar1つが1文字を表す」 とのことでした これがいわゆる、視認として 「文字が1つに対して1つの長さが返る(lengthが「1」で返る)」ものであり 「U+FFFFよりも大きいコードポイントを持つ文字は、「補助文字」と呼ばれ、この範囲の文字はchar2つで1文字を表す」とのことでした。 これが「文字が1つに対して1つの長さが返る(lengthが「1」で返る)」サロゲートペアと呼ばれるもの と書かれてありました。 Unicodeってこんな風になっているのですね^^;