• 締切済み

Shift-JISからUTF-8への変換が出来ません

初歩的な質問で申し訳ありませんが、大変困っております。ただいまimagettftext()を使って日本語主力したく悪戦苦闘しております。  ページ自体はShift-JISで制作していますのでimagettftext()で日本語を出力する場合はUTF-8へ変換して出力するところまでは知れべていて分かりました。しかしいざmb_convert_encoding()で変換しようとするとなぜかUTF-8へ変換されません。 $str = mb_convert_encoding($str,"UTF-8","SJIS"); print mb_detect_encoding($str);  結果→SJIS しかしこれがEUC-JPなら変換されます。 $str = mb_convert_encoding($str,"EUC-JP","SJIS"); print mb_detect_encoding($str);  結果→EUC-JP なぜなのか原因が分からなく困っております。 どなたかご教授願いませんでしょうか? よろしくお願い致します。

  • PHP
  • 回答数1
  • ありがとう数2

みんなの回答

  • calltella
  • ベストアンサー率49% (317/635)
回答No.1

いろいろとテストしましたがきちんとUTF-8と認識しますよ? $strの中身に問題があって誤認識しているのかもしれませんので 他の文字列で確認してみて下さい。 そしてわかっているとは思いますが 日本語文字を画像出力する場合は日本語対応のフォントを使ってくださいね。

tetsu222
質問者

補足

ご回答有り難うございます。 日本語対応のフォントはTTFを置いとけば良いんですよね? それは何となく分かったのですが、いろいろ試して見ても、 $str = mb_convert_encoding($str,"UTF-8","SJIS"); print mb_detect_encoding($str);  結果→SJIS なぜか変換が出来ずSJISのままです。

関連するQ&A

  • PHP+Postgres 「髙」が文字化け

    DB上に格納した文字列を取得し、PHPで出力すると、 「髙」(はしごだか)等、一部の文字が「□・」のような見た目に化けてしまいます。 環境は以下です。 Linux(CentOS 5) PHP 5.1.6 Apache 2.2.3 PostgreSQL 8.4.3 文字コードは以下です。 Postgres:EUC-JP PHPソース:EUC php.ini の[mbstring]はコメントのまま変更していません。 文字コードの変換を試してみたのですが、「髙」としては出力できませんでした。 Windows上では「CP51932」に変換すると正常に出力できましたが、Linux上ではやはり駄目でした。 mb_language("uni"); mb_internal_encoding("euc-jp"); mb_http_input("auto"); mb_http_output("euc-jp"); $str = "髙橋"; print(mb_convert_encoding($str, "EUCJP-win")); print(mb_convert_encoding($str, "EUCJP-win","EUC-JP")); print(mb_convert_encoding($str, "SJIS")); print(mb_convert_encoding($str, "SJIS","EUC-JP")); print(mb_convert_encoding($str, "SJIS-win")); print(mb_convert_encoding($str, "SJIS-win","EUC-JP")); print(mb_convert_encoding($str, "UTF-8")); print(mb_convert_encoding($str, "UTF-8","EUC-JP")); print(mb_convert_encoding($str, "EUC","SJIS")); print(mb_convert_encoding($str, "Unicode")); print(mb_convert_encoding($str, "Unicode","EUC-JP")); print(mb_convert_encoding($str, "UTF-8", "sjis-win")); print(mb_convert_encoding($str, "CP51932")); print(mb_convert_encoding($str, "MS932")); print(mb_convert_encoding($str, "MS932","EUC-JP")); print(mb_convert_encoding($str, "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win" ), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win","EUC-JP"), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "EUCJP-win","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "EUCJP-win","SJIS-win")); http://blog.livedoor.jp/loopus/archives/50160285.html 上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、 文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。 ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。

    • ベストアンサー
    • PHP
  • 文字化け(Shift-jis→UTF-8変換)で困ってます。

    フォームから送信されたShift-jisの文字列をUTF-8に変換して、ImageTTFText関数を使用して画像として表示させようとしているのですが、文字化けをしてしまって困っています。 入出力はShift-jisで、内部処理はUTF-8で行いたくて色々実験してみたのですが、どうにもうまくいきません。 以下にソース・環境を載せますので、どなたか、間違いをご指摘いただけないでしょうか? なるべくPHP.iniの設定は変えないで対処したいです。 どうか、よろしくお願いいたします。 【サーバのPHP.iniの設定(PHP ver.4.3.9)】 mbstring.detect_order = auto mbstring.encoding_translation = off mbstring.http_input = auto mbstring.http_output = SJIS mbstring.internal_encoding = EUC-JP mbstring.language = Japanese 【使用しているソース】 <?php mb_language("ja"); mb_internal_encoding("UTF-8"); mb_http_input("SJIS"); mb_http_output("SJIS"); // 表示する文字列 $str = mb_convert_encoding($_GET["txt"], "UTF-8", "SJIS"); // 画像サイズ define ( IMGWID, 300 ); define ( IMGHEI, 300 ); // フォントサイズ define ( FONTSIZE, 20 ); // 文字のスタート位置 define ( START_X, 10 ); define ( START_Y, 50 ); // 生成画像 $img = imagecreatetruecolor ( IMGWID, IMGHEI ); // フォント色 $fntc = ImageColorAllocate ( $img, 255, 255, 255 ); // 使用するフォント define ( FONTTYPE, '../font/DFKaiE.ttf' ); // フォントパスの設定 putenv ( 'GDFONTPATH='.realpath('.') ); $x = START_X; $y = START_Y; // 入力された文字を書き出し ImageTTFText ( $img, FONTSIZE, 0, $x, $y , $fntc, FONTTYPE, $str ); header ( "Content-type: image/jpeg" ); ImageJpeg ( $img ); ImageDestroy ( $img ); ?>

    • 締切済み
    • PHP
  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • shift-jisからutf8に変換

    解決に至らなかったので再度お尋ねします。 CGIのコードを見てくださいますか。 http://hotpegasus.bov.jp/mail.txt (必要な部分だけ表示しておりますので、そのままアップしても機能はしません) 改修した箇所は以下のです。 <meta http-equiv="Content-Type" content="text/html;charset=shift_jis"> &jcode'h2z_sjis(*contenido) &jcode'convert(*subject,'sjis'); &jcode'convert(*infor,'sjis'); &jcode'convert(*contenido,'jis'); &jcode'convert(*res_msg,'jis'); print "Content-type: text/html;charset=shift_jis\n\n"; ↓ sjis関連をutf8に書き換え、jcodeの頭文字をJに書き換え <meta http-equiv="Content-Type" content="text/html;charset=utf8"> &Jcode'h2z_utf8(*contenido) &Jcode'convert(*subject,'utf8'); &Jcode'convert(*infor,'utf8'); &Jcode'convert(*contenido,'utf8'); &Jcode'convert(*res_msg,'utf8'); print "Content-type: text/html;charset=shift_utf8\n\n"; require 'jcode.pl'をuse Jcode;に書き換え ※jcode::" となっている箇所はありません 結果 メールフォームはエラーや文字化けは出なくて成功しましたが、メール受信の際、ThunderbirdPortableメーラーでは全て文字化け(文字エンコーディングは「日本語ISO-2022jp」となっています)、ウェブメールのgmailでは内容は文字化けになっていませんが、タイトルが文字化けになっています。 どこが悪かったのでしょうか? 宜しくお願いします。

    • 締切済み
    • CGI
  • mb_detect_encoding()関数について

    かなり初歩的な質問かもしれませんが、とあるサイトを参考に、以下のスクリプトを作って文字コードをEUC、 改行コードをLFにして保存し、実行しました。 <?php $str="PHP練習"; print mb_detect_encoding($str); ?> これを実行した結果は、 UTF-8でした。 てっきり保存した文字コードが出力されると思ったんですが違いました。ためしに今度は「$str="PHP練習";」の部分を「$str="PHP";」に してみたらASCIIと出力されました。 さらに今度は「mb_detect_encoding($str);」の部分を、 「mb_detect_encoding($str,"UTF-8");」にして実行したら、 UTF-8と出力されました。 「mb_detect_encoding($str,"SJIS");」にして実行したら、 SJISと出力されました。 あといろいろ$strの中の文字を変えたりしてみましたが、 たまに何も出力されないときもありました。 サイトの説明を見たら、「mb_detect_encoding()関数は、文字列のエンコーディング形式を検出します」と書いてありました。 この「文字列のエンコーディング形式」というのは何によって決まるのでしょうか?

    • 締切済み
    • PHP
  • mb_ereg_replace での文字変換

    PHPでフリーの掲示板を制作中です。 目立たせようとする記号を削除しましたがうまく動きません。 $html = mb_ereg_replace('△', '', 'あああ△あああ'); ・希望結果 ああああああ ・実際の結果 ああ 文字コードは全て EUC-JP です。 また以下を追加するとエラーがでました。 $str="あああ△あああ"; $str = mb_convert_encoding($str, 'EUC-JP', 'auto'); ・エラー Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in そもそもmb_convert_encodingを使わない方が良いのか使い方が悪いのかも解りませんがアドバイスお願いします。

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

    例えば以下のコードで日本人がターゲットのサイトを作ったときにエンコードがutf8以外ってありますか?idなどもutf8でなんとかなるのになぜ他の文字コードは必要なのですか? //SJISに変換 $str = "私のidはrxxdtggb63332224667です。"; $result = mb_convert_encoding($str, "SJIS"); echo $result . "\n"; //UTF-8に変換 echo mb_convert_encoding($str, "UTF-8"); //SJISに変換 $str = "gcdddyyghgcc.jpg"; $result = mb_convert_encoding($str, "SJIS"); echo $result . "\n"; //UTF-8に変換 echo mb_convert_encoding($str, "UTF-8");

    • ベストアンサー
    • PHP
  • phpでの文字エンコード

    携帯用のHPを作っているのですが、データベース文字コードがEUC-JPの為、一部の携帯では正常に表示されないでいます。 それで文字コードをShift_JISに変換してから出力したいのですが、 同時にmb_convert_kanaを使って全角カナを半角にしたいとも考えています。 個別に変換するなら、 $str = mb_convert_kana($row["~"],"k"); print mb_convert_encoding($str,"SJIS","EUC-JP"); で良いかと思うのですが、 ページ全体の出力文字を一気に変換する方法がわからないでいます。 そのような方法はあるのでしょうか? どうぞ宜しくお願いします。

    • ベストアンサー
    • PHP
  • 「髙(はしごたか)」を文字コード変換

    PHPにて、シフトJISで書かれたファイルを読みこみ、文字コードをEUCに変換して出力させる処理を書いています。 mb_convert_encoding($str, "EUC-JP", "SJIS")にて変換させています。 ただ、以下の文字が 髙(はしごたか)、 﨑(たつさき) うまく変換できずに 「?」という文字になってしまいます。 何か解決方法はないでしょうか??

    • ベストアンサー
    • PHP
  • 文字コード変換

    初心者で、どう質問をすれば理解してもらえるか分かりませんが、 文字コードを出力先に合わせて "EUC-JP"と変換していのですがうまい事いきません。 <?php $str = "あああ"; $str = mb_convert_encoding($str, "EUC-JP", "auto"); echo $str; ?> というふうに書いても Fatal error: Call to undefinde function mb_convert_encoding() と出てきて、エラーがおきてしまいます。 ちなみにMS-DOSを使用してます 答えれる事は何でも答えますので何か、ほかに方法があれば教えてください。 お願いします。

    • 締切済み
    • PHP