• 締切済み

java6で4バイトUTF-8文字を利用するには?

お世話になります。 現在、java Version6 Update24(日本語版)のJDKを、 Windows7 Pro 32bit SP1内に入れて、 Apache HTTP Server 2.2.19(VC9)、 Apache Tomcat 6.0.32、 PHP 5.3.6(VC9 x86 ts)、 MySQL5.5.12、 Eclipse3.6(Helios) pleiades-All-In-One(Java)、 という開発環境で、 Javaサーブレット、JSP、JavaBeansを利用して、 動的Webアプリを開発中です。 まず最初に、文字コードとしてUTF-8(3バイト以内)で、 上記環境を一通り作成し、SQL文のUPDATE処理等が、 JavaとMySQL間で問題無く動作していることを確認済です。 その状態で、 次に、 UTF-8で4バイトになる文字(JIS X 0213の漢字第3・第4水準の一部が4バイトになる)を、 ためしに、直接JavaサーブレットのdoPostメソッド内へ、 「JIS X 0213(1面)(漢字第3水準)」 Unicode:U+2000B UTF-16 :0xD840 0xDC0B の文字である、"𠀋"を、    ↓ String strTest = "𠀋"; みたいにして、単純に代入するだけのロジックをためしに追加して、 Eclipse3.6でデバッグトレースしてみたところ、 strTest内に対して、上記文字が代入されない状態です。 (UPDATE時には、SQL Exceptionエラーになっています) 現在は、 request.setCharacterEncoding("UTF-8"); という状態ですが、 この"UTF-8"を、 どのような文字コードに変更すれば、 UTF-8で4バイトになる文字(JIS X 0213の漢字第3・第4水準の一部が4バイトになる)を、 Javaで、文字列(String)として利用可能な状態に出来るのでしょうか? (Oracleのサイト   http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/intl/encoding.doc.html  で探しましたが、該当すると思われる文字エンコードが見当たらなかった為・・・) または、他の方法で実現する必要がありましたら、 その方法をぜひ教えてください。 以上、よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数2

みんなの回答

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

>この代入直後に、Eclipse3.6(Java)で、 >デバッグトレースして見た >文字列変数strTest内の値が正しく表示されていなかった為、 多分、これもeclipseで正しく表示できないだけです。 ファイルなどに出力して試してみてはどうでしょうか。 String charset = "utf-8"; String strTest = "𠀋"; BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("hoge.txt"),charset)); out.write(strTest); out.close(); とした場合、eclipseでデバッグした際の変数の値には"□□"となってしまいましたが、 ファイルには正しく"𠀋"と出力されていました。

hiroasa21
質問者

お礼

残念ながら、この問題は未解決のままですが、 こちらで実際に必要になる予定は数カ月先の為、 もう少し過ぎてから、 あらためてネットなどで情報収集してみます。 遅くなりましたが、 本当にご回答ありがとうございました。

hiroasa21
質問者

補足

「yamada_g」様 お世話になります。 ご回答ありがとうございます。 私も、eclipseでデバッグした際の変数の値には"□□"となっていましたので、 そこで正しく値がstrTest内に代入出来ていないのが、 障害原因と思っていました。 以下にあらためて、 補足質問を追加で、させていただきますので、 もしよろしかったら、ご回答をお願いします。   ↓ strTestに代入後、 そのままeclipseのデバッグトレースで処理を進めていって、 MySQL5.5.12 (utf8mb4という4バイトUTF-8文字に対応した  文字コードでデータベースおよび、その中の各テーブルを  新たに作成済で、その各テーブル内に対して、  これまで利用してきた3バイト以内のUTF-8文字データを  前もって正常に格納済) に対して、SQLでUPDATEを実施した際にも、 SQL Exceptionエラーが発生している状態です。 なお、Javaサーブレット内(doPostメソッド内)では、 4バイトUTF-8文字に対応した文字コードが、 見当たらない状態のため、これまで通り、 utf8でエンコードを指定している状態です。 javaサーブレット内で、 4バイトUTF-8文字に対応した文字コードで、 エンコードする必要があるようでしたら、 何という文字コード(utf8以外で・・・?)で、 エンコードを指定すれば、 よろしかったでしょうか? それとも、MySQL5.5.12(utf8mb4)側の 問題でしたでしょうか? 以上になります。 よろしくお願いします。

回答No.1

それってJava側の問題? MySQL側の問題じゃないの? http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html

hiroasa21
質問者

お礼

残念ながら、この問題は未解決のままですが、 こちらで実際に必要になる予定は数カ月先の為、 もう少し過ぎてから、 あらためてネットなどで情報収集してみます。 遅くなりましたが、 本当にご回答ありがとうございました。

hiroasa21
質問者

補足

ご回答ありがとうございます。 私の書き方が、わかりずらかったのですが、 今回の質問内容は、 MySQLに接続する前の段階になります。 Javaのサーブレット(doPostメソッド)内において、 文字列変数strTestに対して、 4バイトUTF-8文字を、1文字代入しているだけですが、 この代入直後に、Eclipse3.6(Java)で、 デバッグトレースして見た 文字列変数strTest内の値が正しく表示されていなかった為、 この段階で、正しく表示されるようにする必要があると思っています。 もしかするとJava自体が、このような4バイトUTF-8文字を プログラム内で、取り扱えないような仕様なのでしょうか? (3バイト以内のUTF-8文字は、問題無く取り扱えている状況の為・・・) もしよろしかったら、アドバイスいただけましたら幸いです。 よろしくお願いします。

関連するQ&A

  • 4バイトUTF-8文字でUPDATEするには?

    お世話になります。 Windows7 Pro 32bit SP1内に、 MySQL Ver5.5.12と、 phpMyAdmin Ver3.3.10.1を入れています。 (ほかに、  Apache HTTP Server 2.2.19(VC9)、  Apache Tomcat 6.0.32、  PHP 5.3.6(VC9 x86 ts)、  Eclipse3.6(Helios) pleiades-All-In-One(Java)なども) この開発環境で、 phpMyAdminを開いて、 文字コードとしてUTF-8(3バイト以内の文字)では、 SQL文のUPDATE処理等が、 問題無く動作していることを確認済です。 そこで、質問内容ですが、 UTF-8で4バイトになる文字(JIS X 0213の漢字第3・第4水準の一部が4バイトになる)、 「JIS X 0213(1面)(漢字第3水準)」 Unicode:U+2000B UTF-16 :0xD840 0xDC0B の文字である、"𠀋"を、    ↓ phpMyAdminを開いて、これまで3バイトまでのUTF-8文字と同様に、 1つのVARCHAR属性フィールドに対して、 𠀋 と手入力して、 phpMyAdminの[実行する]ボタンをクリックして、 UPDATEしてみたところ、 登録された文字列が、"????"として更新されてしまいます。 これを、正しい文字 𠀋 として更新されるようにするには、 どのような対応をすれば、よろしかったでしょうか? なお、現在、 コマンドで、 SHOW VARIABLES LIKE 'char%'; を実行すると、 以下のような表示がされている状態です。   ↓ character_set_client    :utf8mb4 character_set_connection :utf8mb4 character_set_database  :utf8mb4 character_set_filesystem :binary character_set_results   :utf8mb4 character_set_server   :utf8mb4 character_set_system   :utf8 character_set_dir      :D:\mysql\share\charsets\ 以上になります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 文字コードについて(どのファイルをどの文字コードにして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)

    • ベストアンサー
    • Java
  • AL32UTF8でJIS第三水準文字を挿入したい

    Oracle 11g + Windows 2008 Serverです。 サーバー上でPL/SQLを使用して JIS第三水準文字をinsertしようとしています。 キャラクターセットはAL32UTF8にしています。 通常の漢字など第一・二水準の文字は問題なく insertできるのですが、「丫丮丯丰」のような 第三水準の文字をinsertすると、エラーにはなりませんが、 selectした場合に「?」と表示されます。 また、lengthbでサイズを確認すると1バイトであるため、 第三水準の文字を認識できずに「?」に変換されているようです。 どのようにすれば問題なくinsertできるのでしょうか。

  • UTF-8で5~6バイトになる文字コード

    UnicodeのUTF-8で5~6バイトになる文字コードは、どのような場合でしょうか。(サロゲートペアのコードでも4バイトです。シフトJISから変換するとき、どのようなコードが5~6バイトに割り当てられるのでしょうか。) ご存知の方おられましたら、ご教示ください。

  • UTF8コードで1バイトの文字が2バイトで表現されているのですが・・・・?

    UTF8コードで1バイトの文字が2バイトで表現されているのですが・・・・? とタイトルの通りデータに    UTF-8のデータを扱っていて  16進表記で『0xC341』と  データが入ってきました。 0xC3…11000011  0x41…01000001 UTF-8の仕様で2バイト目の文字は先頭ビットが 10 から始まる仕様となっていると思いますが  2バイト目の先頭ビットが 0 の場合はUTF-8コードが  壊れていると判定してもいいんですか?    それとも、2バイトの先頭ビットが0の場合  次のバイトを1バイト文字とし変換してあげて  0x41 → A として変換するなどといった  特殊な仕様が隠れていたりするのでしょうか?    今のところ壊れていると判断しているのですが、  UTF-8ではないコードだったりする可能性もあるかな?  っと思い質問いたしました。  少し不安だったので、しっていましたら、教えてください。                          以上   検索ワード UTF-8 2バイト目 1バイト文字

  • Java+MySQLで特殊文字(丸数字(株)~)が文字化け

    WindowsXP Pro JAVA 1.6.0_15 Struts2 Eclipse 3.5 MySQL 5.0.85 上記の環境で開発を行っております。 Eclipseのテキスト・ファイル・エンコードはShift-JISになっており、 MySQLの設定は以下のようになっております。 character_set_client | utf8 character_set_connection | utf8 character_set_database | utf8 character_set_filesystem | binary character_set_results | utf8 character_set_server | utf8 character_set_system | utf8 各テーブルの文字コードはSJISになっております。 この状態で(1)(株)II~等を使用すると文字化けしてしまいます。 携帯用のページの為、 JSPのヘッダーのcharsetは <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=Shift_JIS" /> にしてあります。 試行錯誤してみたのですが、どうにもうまくいかず進まない状態です。 お分かりになられる方いらっしゃいましたら是非ともご教授願います。

  • UTF-8 と SHIFT-JIS について

    UTF-8 と SHIFT-JIS について SHIFT-JIS は 半角文字でも全角文字でも 2 バイトとなる UTF-8 は 半角文字でも全角文字でも 1 バイトとなる この認識が正しいかどうかどなたか教えてください!

  • Shift_JISからUTF-8への変換について

    いつもお世話になります。 UTF-8には4バイト文字がありますが、Shift_JIS(CP932)からUTF-8へ変換する際、 Shift_JISでは2バイトで表わされる文字が、UTF-8では4バイトで表わされてしまう文字はありますでしょうか。 宜しくお願いします。

  • UTF-8とUTF-16について質問です。

    まず、【あ】という文字をUTF-16というエンコーディング方式で バイト配列化すると [0] => 66 [1] => 48 というバイト値が帰ってきます。 これはとりあえずC#で処理を行いました。 Encoding encode = Encoding.GetEncoding("UTF-16"); String value = "あ"; Byte [] byteData = encode.GetBytes(value); それでは【あ】という文字の文字集合のコードポイントは右記となります。【0x3042】 これは、出力された 66、48という数値を16進数に変換すると 66=>42 48=>30 となり、リトルエンディアン環境で 0x4230という16進数であらわされるようです。 この点も不思議なのですが今回知りたいのはUTF-16でエンコーディングされた バイト配列はこのように文字集合のコードポイントに復帰?させることができますよね? ではUTF-8でエンコーディングされた【あ】という文字の バイト配列 [0] => 227 [1] => 129 [2] => 130 というバイト配列を上記のような文字集合のコードポイントの値へ復帰させることは できるのでしょうか? それに伴いUTF-8でつかわれる文字集合もUTF-16と同じコードポイントなのでしょうか? 上記 1.UTF-8でエンコーディングされた文字列をバイト配列にした場合 元の文字集合に戻せるのか?戻せるならばその戻し方は? 2.UTF-8がさす文字集合とUTF-16がさす文字集合はおなじものですよね? 上記二点よろしくご教授ください。

  • JIS X 0213で定義されているのは6,879字それとも11,233字?

    JIS X 0213には第3水準漢字、第4水準漢字、非漢字(英数字、仮名、記号など)659字、計4,354字の文字とその文字コードが定義されていると聞きました。しかし、JIS X 0213には、第1水準漢字、第2水準漢字、非漢字524字の計6,879字も併せて合計で11,233字が収録されているとも聞きました。 質問1 この4,354字と11,233字の差はどのように考えたらよいのでしょうか。JIS X 0213で定義されたのが4,354字、JIS X 0208で定義されたのが6,688字、JIS X 0201で定義されたのが191字であり、JIS X 0213ではそれらの全てを、定義しているわけではないが、表示はしているということでしょうか。 質問2 また、もし表示はしているということであれば、その表示はJIS X 0213のどの部分においてさなれているのでしょうか。 http://www.jisc.go.jp/app/pager?id=13864 にJIS X 0213の一覧があるのは分かるのですが、このうちのどこに表示されているのか分かりません。

専門家に質問してみよう