• 締切済み

PHPからJavaを呼ぶと2バイト文字が文字化けします

Linux+PHP4 にてJava 1.4.2のライブラリーを呼ぶと 2バイト文字が ?? となって処理されてしまいます <例> <?php $J_String = new Java('java.lang.String',"aたbcdefg"); print $J_String->length()."<br>" ; print $J_String->substring(0,4)."<br>" ; ?> を実行すると下記が返ってきます 9<br>a??b<br> #『た』の部分が『??』となります 対応方法をご存知でしたら教えて下さい //

  • 3rd
  • お礼率100% (1/1)
  • PHP
  • 回答数1
  • ありがとう数6

みんなの回答

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 java.lang.StringはUNICODEだ。なのでPHPから文字を入れ込むときにはUTF-8などの形式で文字列を記述する必要がある。  対処方法はPHPを全てUTF-8で記述する、jcode.phpで文字コードを変換してから渡す、などがあるかな。  java.lang.Byte列として読み込んでjava側で文字コード変換してやっても良いが、それなら最初からjavaを使う意味が無いような気がする。javaで自作クラスを作ってそれをphpから使うなら別だが。

3rd
質問者

お礼

早速のご返信感謝致します。 早速、ご指摘頂けました内容で確認をしてみました。

3rd
質問者

補足

長文失礼します。 EUC→JIS、EUC→UTF-8変換した2バイト文字をPHPからJavaへ渡し処理をした結果を載せさせて頂きます。 不備が御座いましたら、ご指摘頂ければ幸いです。 jcode.phpは下記のものを利用させて頂きました http://www.spencernetwork.org/ → 漢字コード変換 ◆確認ソース <?php require("./jcode.php"); include("./code_table.jis2ucs"); $string ="てすと"; print "AutoDetect:".AutoDetect($string)."<br><br>"; print "<hr>" ; $JIS_String = JcodeConvert($string, 1, 3) ; print "AutoDetect:".AutoDetect($JIS_String)."<br>"; print $JIS_String."<br>" ; $J_String = new Java('java.lang.String',$JIS_String); print $J_String->length()."<br>" ; print $J_String->toString()."<br>" ; print "<hr>" ; $UTF8_String = JcodeConvert($string, 1, 4) ; print "AutoDetect:".AutoDetect($UTF8_String)."<br>"; print $UTF8_String."<br>" ; $J_String = new Java('java.lang.String',$UTF8_String); print $J_String->length()."<br>" ; print $J_String->toString()."<br>" ; print "<hr>" ; ?> ◆処理の内容 EUC の 『てすと』文字列をJIS、UTF-8変換した後 ・コード確認 ・変換後の文字表示 ・Javaで受け取った文字の長さ表示 ・Javaで受け取った文字表示 をしています。 実行結果は下記の通りでした AutoDetect:1 -------------------------------------------------------------------------------- AutoDetect:3 てすと 12 てすと -------------------------------------------------------------------------------- AutoDetect:4 縺ヲ縺吶→ 9 ????????? *** AutoDetect の 1はEUC、3はJIS、4はUTF-8を表しています ◆結果 JISで渡した場合は、ほぼ期待通りの動きになりました。 『てすと』はJISコードで12バイトとなります。 UTF-8で渡した場合は、?が9文字で処理されていました。 PHPからJavaのライブラリを利用するには、JISで渡してやって Java内部でUTF-8変換して処理をすすめる必要がありそうに思いました。 //

関連するQ&A

  • java.lang.StringIndexOutOfBoundsException・・・?

    JAVAで作成したプログラムを実行すると 「java.lang.StringIndexOutOfBoundsException: String index out of range: 3 at java.lang.String.substring(String.java:1500)」 とエラーが表示されます。 この意味ってなんなのでしょうか?

  • javaのコードについて

    今、javaの勉強をしています。 サンプルコードに、 String name=name1.substring(name1.length()) String job=job1.substring(0, job1.length() - 1); という2つのコードがあったのですが、いまいちコードの意味というか何を表しているのかよく分かりません。 どなたか教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaについて

    キーボードから入力をして、その後str[0][0]とstr[1][0]の文字を繋げたいのですがエラーとなってしまいます。どう変えたらよいでしょうか。 以下がプログラムです。 import java.io.*; import java.lang.*; import java.net.*; import java.awt.*; class gugu3 { public static void main(String[] args) throws IOException { int KEYWORDMAX=10; int CNTMAX=100; String [][]str = new String[KEYWORDMAX][CNTMAX]; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line=null; for (int i=0;i<KEYWORDMAX;i++){ System.out.println("第"+(i+1)+"番目のキーワードを設定しますか?(y/n)"); line=br.readLine(); if(line.equals("n")) break; for (int s=0;s<CNTMAX;s++){ System.out.println("キーワードを入力してください(終了=0)"); line=br.readLine(); if(line.equals("0"))break; str[s][i]=line; } } String keyword = new String(str[0][0]" "str[1][0]); System.out.println("キーワードは "+keyword); } } 以下はエラー表示です。 gugu3.java:24: ')' がありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ gugu3.java:24: 文ではありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ gugu3.java:24: ';' がありません。 String keyword = new String(str[0][0]" "str[1][0]); ^ エラー 3 個

    • ベストアンサー
    • Java
  • Javaでコンパイルできなくなりました

    javaでコンパイルできなくなりました。今まではJava2 SDK バージョン1.4.2_03をインストールしてコマンドプロンプトからjavac、javaコマンドを用いコンパイル、実行していました。 そして、Eclipse(バーション3.0)というIDE環境に興味を持ちインストールした後にとりあえずもう一度コマンドプロンプトからjavacコンパイルしてみたらエラーがでるようになりました。 ソースを書くと長くなってしまうので簡単に説明すると、String sに"Hello World"を代入してSystem.out.println()で表示させるだけのプログラムです。Eclipseをインストールする前は実行できたのでソースに問題があるという事はありません。エラーメッセージは以下のような感じでした //エラーメッセージ 検出値 : java.lang.String 期待値 : String String s = "Hello World"; その後にソースで String s="Hello World";としていた行を java.lang.String s = "Hello World";に変更しました するとjavacではエラーが出なくなるのですがjavaコマンドで実行すると Exception in thread "main" java.lang.NoSuchMethodError: main というメッセージが出て実行できないです。 環境変数は、SDKインストール後、PATHC:\j2sdk1.4.2_03\bin;を加え、Eclipseインストール後は何も変更していません。 何が問題なのでしょうか?お願いします。

    • ベストアンサー
    • Java
  • エラー(互換性の無い型)

    はじめましてsunoftaiyoと申します。このカテゴリでは初めての質問です。 これからどうぞよろしく御願いします。 早速なのですが tokuten.txtという30個の数字が羅列されたテキストを読み込み、合計点と平均点を表示するプログラムについてなのですが import java.io.*; public class yomikomi03 { public static void main(String[] args) throws IOException { try{ BufferedReader br = new BufferedReader(new FileReader("tokuten.txt")); String tokuten[] = new String[29]; String t[] = new String[29]; int a=0; for(int i=0;i<29;i++) { tokuten[i] = br.readLine(); t[i] = Integer.parseInt(tokuten[i]); } for(int j=1;j<29;j++) { a = a + tokuten[j]; } int b = a/30; System.out.println("合計点は" + a); System.out.println("平均点は" + b); } catch(FileNotFoundException e) { System.out.println("ファイルが見つかりません。"); } } } というソースでコンパイルすると yomikomi03.java:14: 互換性のない型 検出値 : int 期待値 : java.lang.String t[i] = Integer.parseInt(tokuten[i]); ^ yomikomi03.java:18: 互換性のない型 検出値 : java.lang.String 期待値 : int a = a + tokuten[j]; ^ とでます。どのように対処すればよいでしょう?

    • ベストアンサー
    • Java
  • javaのプログラミングについてです!

    2次元配列をつくり、文字列型で名前、身長、体重をキーボード入力していき、それを出力するプログラミングを作っているのですが、今の私ではどこが間違っているのかよくわかりません。 どこが間違っているのか教えていただけると嬉しいです。 import java.io.*; class kadai4 { public static void main(String[] args) throws IOException { //入力するための準備 BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); //新しい配列の準備 String[][] pro; pro=new String[3][3]; System.out.println("名前・身長・体重の順に入力してください"); //入力 for(i=0;i<3;i++){ for(j=0;j<3;j++){ pro[i][j] = new String(br.readLine); } } for(i=0;i<3;i++){ for(j=0;j<3;j++){ System.out.print(pro[i][j]); } } } }

  • javaについて

    以下のようにキーボードから入力していくプログラムを試行しているのですが、エラーが出てくるので行き詰まっています。 理想的にはキーボードに”あいう”エンター”えおか”エンターと打ち込んだら str[0]=あいう str[1]=えおか と表示させていきたいのですが、よろしくお願いします。 import java.io.*; import java.lang.*; import java.net.*; import java.awt.*; class gugu2 { public static void main(String[] args) throws IOException { int i=0; while(i<2){ System.out.println("キーワード入力"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = br.readLine(); char str[] = input.toCharArray(); System.out.println("キーワードは" + str[]); i=i+1; } for(i=0;i<2;i++){ System.out.println(str[]); } } } これがエラー表示です。 gugu2.java:17: '.class' がありません。 System.out.println("キーワードは" + str[]); ^ gugu2.java:21: '.class' がありません。 System.out.println(str[]); ^ エラー 2 個

    • ベストアンサー
    • Java
  • [JAVA]ProcessBuilderで「java -version」を実行できない

    以下のプログラムで「java -version」を実行しようとするとエラーになります。「java」だけですと実行できますが「-version」をつけるとエラーになります。 ---プログラムの内容--- import java.io.*; public class test4518 { public static void main(String[] args) throws Throwable{ ProcessBuilder pb = new ProcessBuilder(new String[]{"java -version"}); Process p = pb.start(); BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = br.readLine()) != null) { System.out.println(line); } } } ーーーエラーの内容ーーー Exception in thread "main" java.io.IOException: CreateProcess: "java -version" error=2 at java.lang.ProcessImpl.create(Native Method) at java.lang.ProcessImpl.<init>(Unknown Source) at java.lang.ProcessImpl.start(Unknown Source) at java.lang.ProcessBuilder.start(Unknown Source) at test4518.main(test4518.java:5)

    • ベストアンサー
    • Java
  • system関数を使用してJava実行(戻り値取得)

    こんにちは。 perlのsystem()関数を使用してJavaを実行し Javaの戻り値をPerlに返す。 以上の事を行いたいのですが、出来ません。 私が作成したソースと実行時のエラーを載せますので、 ご助言お願い致します。 尚、OSはLinuxです。 ----------------------- - Perl (CallTest.cgi) - ------------------------------------- #!/usr/bin/perl print "=== JavaCall START ===\n"; $Jret = "ABC"; print "PerlReturnBefore : " . $Jret . "\n"; $Jret = system("java Test"); print "PerlReturnAfter : " . $Jret . "\n"; -------------------- - Java (Test.java) - ------------------------------------- class Test { public static String main(String args[]) { String ret = "XYZ"; return ret; } } ------------ - 実行結果 - ------------------------------------- #perl CallTest.cgi === JavaCall START === PerlReturnBefore : ABC Exception in thread "main" java.lang.NoSuchMethodError: main PerlReturnAfter : 256 ------------------------------------- 期待している実行結果は === JavaCall START === PerlReturnBefore : ABC Exception in thread "main" java.lang.NoSuchMethodError: main PerlReturnAfter : XYZ です。 Javaの[public static String main]には戻り値が設定できないのでしょうか? 申し訳ありませんがご教授お願い致します。 以上の質問はPerlのカテゴリで良いのでしょうか? Javaのカテゴリにしたら良かったでしょうか? 場違いの質問でしたらスミマセン。

    • ベストアンサー
    • Perl
  • CSV読み込み 文字化け

    失礼いたします。 以前のログを見てエンコードを設定してみたのですが、出力が文字化けします。ローカルファイルを読み込んでコンソール出力しているだけなのですが・・・。 分かる方、よろしくお願いします。 -------------------ソースはここから import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; // import java.io.FileReader; FileReaderからInputStreamReaderに変更済み import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class ReadCSV { public static void main(String[] args) { try { File csv = new File("C:\\AP.csv"); // BufferedReader br = new BufferedReader(new FileReader(csv)); BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"EUC_JP")); // BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(csv),"MS932")); while (br.ready()) { String line = br.readLine(); StringTokenizer st = new StringTokenizer(line, ","); while (st.hasMoreTokens()) { System.out.print(st.nextToken() + "\t"); } System.out.println(); } br.close(); } catch (FileNotFoundException e) { キャッチ処理 }

    • ベストアンサー
    • Java

専門家に質問してみよう