libHaruJNIでおこる文字化けについて

このQ&Aのポイント
  • 現在、libHaruを使ってjavaからPDFを出力するプログラムを組んでいますが、文字化けが起きて困っています。
  • javaからC言語側に日本語文字列を送り、PDFに出力すると文字化けが発生しています。
  • 解決方法が分からず、日本語設定は正しく行われていることも確認しています。
回答を見る
  • ベストアンサー

libHaruJNIでおこる文字化けについて

 お世話になります。  現在、libHaruを使ってjavaからPDFを出力するプログラムを組んでいるのですが、javaからC言語側に日本語文字列を送り、それをPDFに出力すると文字化けが起きてしまい困っています。  恐らくはjava⇒Cの段階ではUTF-8でやり取りされているのに、PDFではS-JISとして書きだされるからだと思いますが、解決方法が分かりません。日本語設定はちゃんと行われており、javaからではなく直接文字列を書き込めばちゃんとPDF上で日本語が表示されます。  コードは以下の通りです。長いので必要箇所だけ書き出します。 java:  WriteStr("かきくけこ",10, 400); C: JNIEXPORT jint JNICALL Java_sample_pdf_PDF_WriteStr (JNIEnv *jenv, jobject jobj, jstring str, int x, int y) { // charにする char *path_str; path_str = jenv->GetStringUTFChars(jenv, str, NULL);//この段階では文字化けしていない HPDF_Page_BeginText (g_page); HPDF_Page_MoveTextPos (g_page, x, HPDF_Page_GetHeight (g_page)-y); HPDF_Page_ShowText (g_page, path_str);//直接”あいうえお”などを打ち込むと化けない HPDF_Page_EndText (g_page); jenv->ReleaseStringUTFChars(jenv, str, path_str); } よろしくお願いします。

  • Java
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.2

>いくつか方法は試したのですが、どれもC++なら問題なく動作するのですが、C言語だとAPIが制約されてしまい変換方法が限られてしまうのです。 「変換方法が限られてしまう」ということは少なくとも変換方法はあるわけですよね。変換できるのならAPIが何であろうが問題ないのでは? それとも「変換方法が限られてしまう」というのは「C言語で使用できる文字コード変換関数やAPIを知らない。」の意味なんでしょうか。 とりあえずプラットフォームがunix系ならiconvがあると思いますし、Windows系ならCでも使えるAPIがあります(具体的なAPIはお調べください) >eclipseから確認するにはどうしたらいいんでしょうか。 char aiueo[]="あいうえお"; とでもすればaiueoの各要素の値から推測できると思いますが。

icomic
質問者

お礼

ご返信ありがとうございます。 iconvで調べてみたらかなりよさそうですね。取りあえずこれを使ってみようと思います。 ありがとうございました。

その他の回答 (2)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

> C言語内でUTF-8からShift_JISに変換する方法が分からなくて困っております。 だったら、Javaコード側でShift_JISに変換してからJNIメソッドに渡せばいいのでは? WriteStr()の引数の型は当然Stringからbyte[]に変更することになりますが。

  • wormhole
  • ベストアンサー率28% (1622/5658)
回答No.1

>恐らくはjava⇒Cの段階ではUTF-8でやり取りされているのに、PDFではS-JISとして書きだされるからだと思いますが、解決方法が分かりません。 libHaruがShift_JISの文字列を要求するのであれば文字列をUTF-8からShift_JISに変換すればいいだけでは? >//直接”あいうえお”などを打ち込むと化けない 「直接”あいうえお”」と書かれても(コンパイル後の)文字コードが何になってるのかわからないんですが・・・

icomic
質問者

補足

ご返信ありがとうございます。 すみません。情報が足りていませんでした。 >Shift_JISに変換すればいいだけでは? libHaruはC言語で書かれているのですが、C言語内でUTF-8からShift_JISに変換する方法が分からなくて困っております。いくつか方法は試したのですが、どれもC++なら問題なく動作するのですが、C言語だとAPIが制約されてしまい変換方法が限られてしまうのです。 >(コンパイル後の)文字コードが何になってるのかわからないんですが・・・ すみません。この辺りに疎いので詳しくは分からないのです。出力したら文字化けしたので恐らくUnicodeに置き換わっているのかな?と思ったんですが、eclipseから確認するにはどうしたらいいんでしょうか。

関連するQ&A

  • graphvizの文字化け

    日本語を入力しても文字化けしてしまい、結局グラフで表しても文字化けしています。 digraph a4{ rankdir=LR; orientation=land; node[fontname="meiryo" shape=circle]; Java -> ��� [label = "517000",weight= "517000" ]; Java -> �_�E�����[�h [label = "183000000",weight= "183000000" ]; Java -> �Q�[�� [label = "7720000",weight= "7720000" ]; Java -> �z�� [label = "692000",weight= "692000" ]; Java -> �C���X�g�[�� [label = "2900000",weight= "2900000" ]; Java -> update [label = "73200000",weight= "73200000" ]; Java -> script [label = "548000000",weight= "548000000" ]; sun -> Java [label = "8790000",weight= "8790000" ]; Java -> API [label = "9320000",weight= "9320000" ]; eclipse -> Java [label = "14800000",weight= "14800000" ]; } これなんですが、fontnameで日本語の使えるフォントにはしているはずなんですが、どうしたら文字化けしないで表示できますでしょうか?

    • ベストアンサー
    • Java
  • java起動時の日本語引数文字化けについて

    java初心者です。 C++ソースからCreateProcess関数を用いてjava.exeを起動し、アプリケーションを起動させるアプリケーションを作成しています。 現在、java側で日本語が文字化けしてしまい、期待する動作が得られていません。 具体的には起動するjavaアプリケーションに引数としてパスを渡しており、そのパスに 日本語が含まれていると文字化けにより解釈できないという状況です。 日本語がアプリケーション内部で正しく利用できるようにはどのようにすれば良いでしょうか。 環境は以下の通りです。 ※情報が足りない等ありましたらお願い致します。。 OS:WindowsXP C++の開発環境:VC6 CreateProcess関数起動時の文字コード:UTF8 java開発環境:eclipse3.5 javaの引数はStringで受けるのですが、java内部ではUTF16らしいので、UTF8で記述された 文字列をUTF16として読むため文字化けしているのかなと調べた結果推測しています。 だとすると、java側で引数で受けた文字列をUTF-8からUTF-16に変換すれば良いのかなと 考えています。 ではその場合どのような処理が必要になるのでしょうか。(String#getBytes()を使う?) 後、javaコンパイル時にエンコードを指定するという方法もあるようですが、その方法は 他へ影響が大きいため、利用できそうにありません。 情報が足りない等あればお願い致します。 ご回答よろしくお願い致します。

  • サーブレットの文字化け

    こんにちは。 JAVAサーブレット時の文字化けで困っています。 環境 ≪サーバー≫ OS:Linux Tomcat4.1.31 JAVA1.4.2 ≪クライアント≫ OS:Windows2000 クライアントからhttp:192.168.X.X:8080/xxx.jspを呼び出して実行しています。 JSPファイル(Shift-JISで保存)からサーブレットを呼び出して サーブレットでrequest.getParameterをした時に、日本語が文字化けしてしまいます。 JSPファイルでは <%@ page language="java" contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J"%> を指定しています。 なにかわかりましたら教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 文字化け

    C言語初心者です。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("表示"); system("PAUSE"); return 0; } と書いてコンパイルしたのですが「表示」のところが文字化けしてしまいます。 他にも文字化けするかもしれないので、 解決法を教えて下さい。 使っているコンパイラは、Bloodshed Dev-C++です。

  • javaというか文字列について少し質問です><

    javaというか文字列について少し質問です>< javaというか文字列について少し質問です>< お願いします。 シーザー暗号で文字列をずらすためのクラスのメソッドをつくったのですが・・・ String decrypt(String str,int key) { StringBuffer sb = new StringBuffer(); // もしくはStringBuilder for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); sb.append( c ); } こんな感じなのですがアルファベットの小文字26文字のみとしたいので暗号化や復号化の際に越えてしまう場合はアルファベット内でループさせたいのですがいまいちやり方が浮かびません><越えてしまう場合はzからひいたものを表現させれば良いかと思いやってみたのですが全然違う文字が出てきてしまいました。何かいい方法を教えてください。お願いします><

    • ベストアンサー
    • Java
  • 文字化けしない書き方

    CString str = "%#.3f" という文字列に関して、数字部分をint valで置き換えたいなと思っています。 そこで、Formatを使って以下のように書きましたが、%#.が文字化けしてしまいます。 str.Format("%s%df", "%#.", val); 1文字ずつなら表示されるようなのですが、%#あるいは#.とやると文字化け(□)になって しまいます。なので、 str.Format("%s%s%s%df", "%", "#", ".", val); とやると、表示されるには表示されるのですが、str.Format("%s%df", ...)という書き方で 書けたらなと思っています。何か方法はないでしょうか。 よろしくお願いいたします。 環境はWindowsXP, VC2005++ &MFC です。

  • 文字列の扱い方

    初歩的な質問ですみません… str文字列からcという文字を見つけたら添字を返すという関数を作ったのですが、 iにこの関数を代入して、if文の制御式にiを使って比較するまでは正常なのですが、 真文にiを使うと何故か偽文(という言い方でいいのでしょうか…この場合("そんな値はありません。"というところです)が実行されてしまいます。 よろしければご教授お願い致します。 #include <stdio.h> int str_char(const char str[],int c) { int len = strlen(str); int i; for (i = 0;i < len;i++) { if (str[i] == c) return i; } return -1; } int main() { char str[64] = "Fucking Brutal Death Metal"; int ch,i; printf("どの文字を調べますか?"); scanf("%c",&ch); i = str_char(str,ch); if (i >= 0) printf("その文字は%d番目にあります。",str_char(str,ch) + 1); //何故かiだと動かない else printf("そんな値はありません。"); return 0; }

  • 文字化けについて

    以下のコードでコンパイルして日本語入力すると 文字化けします。 どうすれば文字化けしなくできますか? new InputStreamReader(System.in)のところもEUC_JPにしたりしたのですが文字化けしてしまいました(汗) import java.io.*; public class test { public static void main(String agrs[]) { try { BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); String boyname,girlname; int goukei=0; System.out.println("男性の名前を入力してください"); boyname=in.readLine(); System.out.println(boyname); char boynameChar[]=boyname.toCharArray(); for(int i=0;i<boyname.length();i++) { goukei+=(int)boynameChar[i]; } System.out.println("女性の名前を入力してください"); girlname=in.readLine(); char girlnameChar[]=girlname.toCharArray(); for(int i=0;i<girlname.length();i++) { goukei+=girlnameChar[i]; } System.out.print(boyname+""と+girlname+"の相性は"+goukei%100+"%"); in.close(); } catch(IOException e) { } } }

    • ベストアンサー
    • Java
  • javaで日本語が文字化けしてしまいます。eclipseからjavaク

    javaで日本語が文字化けしてしまいます。eclipseからjavaクラスを実行する場合、どのようなencodingの式を記述すればいいでしょうか? コマンドプロンプトでjavac -encoding SJIS クラス名.javaと入力すれば日本語の文字化けを解決できますがeclipseからの実行で日本語文字化けを避けられません。 コードを記述するのだと思いますが、どのように記述すればいいのでしょうか? eclipseの設定で文字コードを変更できるみたいですが、SJISには変更できませんでした。 何か解決策はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • 繰り返し文字検索

    strchrを何回か使用して、文字列中の文字を検索したいです。 以下が実行画面 文字列を入力してください。TESTTEEEEEEEEEEEEEEST} 文字を入力してください。T 0 2 0 15 -2686605 以下が実行した関数です。 void sea(const char*str2,int*c){ char *p; while(*p!='\0'){ p=strchr(str2,*c); printf("%d\n",p-str2); str2=p+1; } } char* str2とint *cには、キーボードからそれぞれ、文字列と文字を入力しました。 検索文字の一致した位置の、一つ後ろを指定したいのです。御指摘お願いします。

専門家に質問してみよう