21685


Unityで作成したWindows
PCアプリから、PDF生成を行うPHPスクリプトに対して日本語テキストと100KB未満の画像（バイナリデータ）をpostし、PDF出力を行っています。

日本語テキストのみpostした場合は、文字化けなく正常に出力されます。  
日本語テキストと画像1点をpostした場合は、画像は正常に出力されますが、日本語テキストの文字化けが発生します。  
PHPスクリプトの画像出力箇所をコメントアウトして、日本語テキストと画像1点をpostした場合も、日本語テキストの文字化けが発生します。

メモリ不足が問題ではないかと思い、ini_set関数やphp.iniなどでmemory_limitを128M、256M、512Mと変えてみましたが、結果は変わりませんでした。

もし、上記の現象や原因に関する情報やヒントがございましたら、ご教示よろしくお願い致します。  
環境は次のとおりです。

Windows 10 Pro 64bit  
XAMPP 5.6.15 (PHP 5.6.15)  
TCPDF 6.2.12  
Unity 5.2.3f1  
※Windows PCアプリとXAMPP環境は同一PC内に共存

送信側サンプルコード

[code]

    private IEnumerator PostWithBinary2(byte[] byteData, System.Action<WWW> callback)
    {
        string url = "http://localhost/report/sample.php";
    
        WWWForm form = new WWWForm();
        form.AddField("title", "日本語タイトル");
        form.AddField("date", "2016-01-01");
        form.AddField("copyright", "Copyright (C) 2016 日本語著作者. All Rights Reserved");
        form.AddBinaryData("picture", byteData, "picture.png", "image/png");
    
        WWW www = new WWW(url, form);
        yield return www;
    
        if (callback != null)
        {
            callback(www);
        }
    }
    
[/code]

受信側サンプルコード

[code]

    <?php
    ini_set('memory_limit','128M');
    require_once('./tcpdf/tcpdf.php');
    
    // Extend the TCPDF class to create custom Header and Footer
    class MYPDF extends TCPDF
    {
        private $hTitle='';
        private $hDate='';
        private $fCopyright='';
    
        //Constructor
        function __construct($orientation,$unit,$format,$unicode,$encoding,$diskcache,$pdfa,$title,$date,$copyright)
        {
            parent::__construct($orientation,$unit,$format,$unicode,$encoding,$diskcache,$pdfa);
            $this->hTitle=$title;
            $this->hDate=$date;
            $this->fCopyright=$copyright;
        }
    
        //Page header
        public function Header() {
            // Logo
            $imageFile=dirname(__FILE__).'/logo.jpg';
            if(file_exists($imageFile))
            {
                $this->Image($imageFile,10,15,32,0,'JPG','','T',false,150,'',false,false,0,false,false,false);
            }
            // Title
            $this->SetXY(50,22.5);
            $this->SetFont('cid0jp','B',16);
            $this->Cell(110,20,$this->hTitle,0,false,'C',0,'',0,false,'L','M');
            // Date
            $this->SetX(190);
            $this->SetFont('cid0jp','',14);
            $this->Cell(0,20,$this->hDate,0,false,'R',0,'',0,false,'L','M');
         }
    
        // Page footer
        public function Footer() {
            // Copyright
            $this->SetY(-15);
            $this->SetFont('cid0jp','',10);
            $this->Cell(0,10,$this->fCopyright,0,false,'C',0,'',0,false,'T','M');
        }
    }
    
    // check Image
    function checkImage($file)
    {
        if($file['type']!='image/png')
        {
            return false;
        }
        if($file['error']>0)
        {
            return false;
        }
        if(!move_uploaded_file($file['tmp_name'],dirname(__FILE__).'/images/'.$file['name']))
        {
            return false;
        }
        return true;
    }
    
    // create new PDF document
    $pdf=new MYPDF(PDF_PAGE_ORIENTATION,PDF_UNIT,PDF_PAGE_FORMAT,true,'UTF-8',false,false,$_POST['title'],$_POST['date'],$_POST['copyright']);
    $pdf->setHeaderData(PDF_HEADER_LOGO,PDF_HEADER_LOGO_WIDTH,PDF_HEADER_TITLE,PDF_HEADER_STRING);
    $pdf->setHeaderFont(Array('cid0jp','',14));
    $pdf->AddPage();
    $pdf->SetFont('cid0jp','',14);
    $pdf->SetFillColor(230);
    
    // output Image
    if(array_key_exists('picture',$_FILES))
    {
        $file=$_FILES['picture'];
        if (checkImage($file))
        {
            $x=10;
            $y=125;
            $pdf->Image(dirname(__FILE__).'/images/'.$file['name'],$x,$y,92,0,'PNG','','',true,200,'',false,false,1,false,false,false);
        }
    }
    
    // save PDF
    $reportFile=dirname(__FILE__).'/report.pdf';
    if(file_exists($reportFile))
    {
        unlink($reportFile);
    }
    $pdf->Output($reportFile,'F');
    
    // return JSON
    $json = array(
        'resultReportFile'=>(empty($_SERVER['HTTPS'])?'http://':'https://').$_SERVER['HTTP_HOST'].(dirname($_SERVER['SCRIPT_NAME']).'/report.pdf'),
        'error'=>'',
    );
    header('Content-Type: application/json');
    echo json_encode($json);
    ?>
    
[/code]

文字化けしなかった例  
[![ヘッダー部とフッター部に日本語テキスト出力。左上の青い箇所はPHPスクリプトと同じ場所にある画像を出力。](https://i.stack.imgur.com/sxVcq.png)](https://i.stack.imgur.com/sxVcq.png)

文字化けした例  
[![ヘッダー部とフッター部に日本語テキスト出力。中央の画像がpostしたもの。](https://i.stack.imgur.com/y2NP6.png)](https://i.stack.imgur.com/y2NP6.png)


CC BY-SA 3.0
2016-02-03T16:54:27.157
21682
2016-02-04T03:13:56.347
2016-02-03T18:55:35.360
10848
10848
question
php pdf xampp
TCPDFで日本語テキストと画像を出力する場合の文字化けについて


自己解決です。

multipart/form-dataでファイルをアップすると文字化けするという情報が、随分前のものでしたがありました。  
[マルチパートフォームの挙動に注意する](http://randd.kwappa.net/2008/08/16/34)

そこでひとまず、php.iniを次のように変更しました。

変更前: `mbstring.http_input = auto`  
変更後: `mbstring.http_input = UTF-8`

こちらを参考にしました。  
[mbstring.encoding_translationが原因で文字化け](http://nob-
log.info/2013/03/25/mbstring-encoding_translation/)


CC BY-SA 3.0
2016-02-04T03:13:56.347
21685
2016-02-04T03:13:56.347
10848
21682
answer