• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:String <=> byte配列 の際のエンコード(続))

String <=> byte配列 の際のエンコード(続)

ranxの回答

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

> では、request.getParameter("test") の結果返ってくる String は > ブラウザのエンコードでパラメータを表現するバイト列を用い、 > 値はそのままで、エンコード名だけを8859-1として構築されたもの、 > になると思うのですが、 > そういう認識で正しいのでしょうか。 質問の意味がよく分からないのですが、String型はつねにUnicodeで表現 されますから、バイト列そのままということはないですよね。もっとも、 0x0020~0x007eの分については、ASCIIそのままですから、そういう意味で あれば値はそのままとも言えます。もちろん、漢字のコードなどが入り 込んでいればそういうわけにはいきませんし、円通貨記号のように、日本で 通常ASCIIとして扱っているものでも8859-1とは異なるものもありますね。 というわけで、ご質問の文章、何だかおかしいという感じですが、よく 分からないので、明確にして頂けると回答しやすいと思います。

Harry_
質問者

お礼

レスありがとうございます。 私は、自分の上記の認識であってるという自信がありません。 もし正しくないのであれば、つまるところ、質問は、 String#getBytes("8859_1") の結果、日本語が返ってくるというのは 一体どういうことか、ということになります。 byte[] b = "あいうえお".getBytes("SJIS"); String str1 = new String(b, "8859_1"); String str2 = new String(str1.getBytes("8859_1"), "SJIS"); System.out.println(str2); このコードが、正しく"あいうえお"を出力するのは確認しました。 そこで、二行目の str1 が、バイト列 b の元の値と、現在のエンコードが 8859_1 である、という情報とを両方保持してなければ、これらの 一連の変換の後、もとの文字列が復元できることが説明できない、 と思ったのが、質問で書いた"認識"の詳しい内容です。 ところで、ranxさんのレスのString型は常にUnicode...のところを読んで、 はっ、としました。言われてみればそうだった、と思ったんですが、 それを考えると、上のコードが元の文字列を出力するのが何故なのか、 全くわからなくなりました。 で、色々試してると、上のコードの 8859_1 の部分を二箇所とも BIG5 とか 別のエンコードに変えると、うまく変換できなくなることに気づきました。 それで勝手な推測なんですが、 String型は文字列表現にUnicodeだけでなく、8859_1も 利用できる、ということはないですか。

関連するQ&A

  • 困ってます。

    文字化けについて分からない事があります。 環境は RedHatLinux7.2, Postgresql7.1, Tomcat3.2.4, JDK1.4.0 です。 HTMLフォームで入力されたパラメータをサーブレットで受け取り、そのパラメータをDBのテーブルにSQLのINSERT文でデータを追加する際に日本語の部分(例:氏名)が文字化けしてしまいます。 文字化けの防止策として、 (1)String KANJINAME = new String(request.getParameter("KANJINAME").getBytes("8859_1"), "JISAutoDetect"); (2)String KANJINAME = new String(request.getParameter("KANJINAME").getBytes("8859_1"), "EUC-JP"); としても、文字化けしてしまいました。 今までサーブレット、JSP等で上記の(1)、(2)のような方法で文字化けを防いできたのですが、今回のようにDBのテーブルにInsert文で日本語を含んだデータを追加しようとすると文字化けしてしまいました。 これはコーディングの問題なのでしょうか?それともTomcat,Linux,Postgresqlに何らかの設定等が必要なのでしょうか? もし何か分かることがありましたら、ご教授お願い致します。

  • JBuilderの文字化け

    JBuilderでサーブレットでパラメータを渡す際に日本語が文字化けしてしまいます。 Enumeration enum=request.getParameterNames(); while(enum.hasMoreElements()){ String key=(String)enum.nextElement(); String value=new String(request.getParameter(key).getBytes("8859_1"),"JISAutoDetect"); out.println(value); } ソースは上記のようになっていますが日本語を表示できません。直す方法がわかる方どうかよろしくお願いします。

  • 文字コード

    少し、聞かせてください。 今、WEBアプリケーションを作っています。 HTMLからのリクエスト文字を受け取りServletで処理を考えています。 そこで、 String para = request.getParameter(para); String param = new String(para.getBytes("8859_1","JISAutoDetect"); で、8859_1,Shift_JIS,EUC-JP,ISO-2022-JP の Unicode 変換することが できるのは、分かりました。 では、この HTML からのリクエスト文字が、どのタイプの文字コード でかかれているかを検出できるのでしょうか? 自分では、バイト列をつかさどる方法が浮かぶのですが・・・。 HPでもかまいませんので、教えてください。

    • ベストアンサー
    • Java
  • サーブレットでデータベース操作。

    サーブレットを使ってMySQL内のテーブルにレコードを追加、変更、削除できるようなプログラムを作っています。流れとしましては『HTML画面→サーブレット起動→レコード追加、変更、削除』といった具合です。追加、変更ができてなぜか削除だけできません。SQL文を書き換えるだけのはずなのですが・・。どなたか教えて下さい。windows2000Professional, j2sdk1.4.0_01, Tomcat3.3.1,MySQL3.23.47 略 . . Connection con = null; Statement stmt = null; try { con = DriverManager.getConnection( "jdbc:mysql://localhost/db_ichat", "root", "pen3"); stmt = con.createStatement(); String seqno = request.getParameter("seqno"); String name = request.getParameter("name"); String namejp = new String(name.getBytes("8859_1"), "JISAutoDetect"); String psw = request.getParameter("psw"); String pswjp = new String(psw.getBytes("8859_1"), "JISAutoDetect"); String email = request.getParameter("email"); StringBuffer buf = new StringBuffer(); buf.append("delete from t_id "); buf.append("where seqno = "); buf.append(seqno); stmt.executeUpdate(buf.toString()); try { stmt.close(); } catch (Exception e) {} try { con.close(); } catch (Exception e) {} . . 略。

    • ベストアンサー
    • Java
  • テキストBOXから取得した文字コードの扱いについて

    JSPで記述したページのテキストBOXに入力されたSJIS形式の日本語文字データをサーブレットに送信してそれを取得して、文字のエンコードを行う際に気がついたのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("ISO8859_1"); text=new String(bytes, "SJIS"); のようにすればサーブレットで扱う時に正しく日本語表示できるのですが String text = request.getParameter("text"); byte[] bytes =text.getBytes("SJIS"); text=new String(bytes, "SJIS"); とすると正しく表示されません。 text.getBytes("SJIS");で取得格納されるbyteのデータに違いがあるようです。この場合取得されるbyteの配列は3つになっています。 ISO8859_1で取得するとbyte配列は2つになっています。このISO8859_1のbyte配列のデータと同じ中身のものを単にString(byteデータ,文字コード)のコンストラクタに入れるとSJISの文字コードで正しく変換出来ています。 要するにもともとSJISの文字データをgetByte("SJIS")で変換したものがなんで、もとに戻せないのかということです。また、違う文字コードのISO8859_1ではSJISに対応したbyteの配列になるのかということです。 ひどい乱文ですみませんが、よろしくお願いします。

  • 困ってます

    HTMLファイルのフォームのパラメータをサーブレットに引渡し、サーブレット内で、ファイルに出力(CSV形式)したいのですが、日本語が含まれていると文字化けしてしまいます。 文字化け防止の為に下記のようなコードを書いているのですが、うまくいきませんでした。(フォームの"name"というパラメータをサーブレットに渡します。) ----------------------------------------------------- (サーブレットのファイルより一部抜粋) //変数&定数の宣言 private static final String csvFile = "/home/csvFile.csv"; String name; FileWriter fw = new FileWriter(csvFile); PrintWriter pw = new PrintWriter(fw); //☆文字化け防止コード name = request.getParameter("name"); name = new String(name.getBytes("8859_1"),"SJIS"); //ファイルに出力 pw.print(name + ","); pw.close(); ----------------------------------------------------- 上記のようなコードの書き方だと駄目でしょうか? ちなみに"SJIS"を"euc-jp"、"JisAutoDetect"に変えてもうまくいきませんでした。 実行方法は (1).windowsでサーブレットをコンパイルし、 (2).(1)で出来たクラスファイルをLinuxに転送し、 (3).Linux上でTomcatの再起動をして実行しています。 もし何か分かることがありましたらご教授お願い致します。

  • バイト配列 unicode

    java初心者です。 以下のソースコードの 「new String(strVal.getBytes("ISO-8859-1"),"JISAutoDetect」 の部分の意味が分からなくこまっています。 <%@ page import="java.io.*" %> <%! public String strEncode(String strVal) throws UnsupportedEncodeingExcception{ if(strVal==null){ return null; }else{ return new String(strVal.getBytes("ISO-8859-1"),"JISAutoDetect")); } } %> そもそも 「バイト配列とは何か」 「なんで必要なのか?」 など、わかりやすく説明していただけると幸いです。

    • ベストアンサー
    • Java
  • 文字エンコードについて

    文字エンコードについてなのですが、 コンピュータでは文字1つ1つに何バイトかの値が割り振られていて、 それを翻訳的なことをして表示していることがわかりました。 で、エンコードによって同じ文字でも内部の値が異なっているということもわかりました。 そこで質問なのですが、私はPHPを勉強しています。 それで文字列のエンコードを変更する関数があるのですが、それで文字列をUnicodeに変更したとします。 でも保存するときにANSIを選択した・・・これってどういうことなんでしょう? しかも、IE等のブラウザ上からも「表示」→「エンコード」→「Shift_JIS」と選択できます。 プログラムの上からのエンコーディング テキストエディタからのエンコーディング これはどちらが優先されているのでしょう。 エンコーディングについて詳しいサイトなどありましたらお願いします。

  • 文字化け

    JSPで取ったデータをServletがGetParameterしています。 文字化け防止のコーディングは以下のようにしています。 String adr = request.getParameter("adr"); //住所 if(adr !=null && adr.equals("")==false){ //文字化け防止(日本語変換) adr = new String(adr.getBytes("8859_1"), "JISAutoDetect"); }else{ adr = ""; } が、全角のハイフン(-)だけが 文字化けしてしまいます。 ?になってしまいます。 なにかいいページかヒントがありましたら 教えてください。

  • エンコード指定でコンパイルエラー

    以下のソースで、UnsupportedEncodingExceptionと、 コンパイルエラーが発生します。 byte[] sjisBytes; // 適当なバイト列を入れる String string = new String(sjisBytes, "Shift_JIS"); // エラー String s; // 適当な文字列を入れる byte[] b = s.getBytes( "Shift_JIS" ); // エラー サポートされている他のエンコーディング(UTF-8など)を入れても、 同じエラーになります。 原因がわかる方いらっしゃいますでしょうか?

    • ベストアンサー
    • Java