Search code examples
javaphpcharacter-encodingbirtphp-java-bridge

Correct character encoding when calling BIRT using Java Bridge in PHP


I'm calling BIRT to generate a PDF report via Java Bridge:

<?php

require_once("java/Java.inc");

class runReport {

    function runReport($report, $param, $output) {

        header("Content-type: application/pdf");
        header("Content-Disposition: attachment; filename=".$output.".pdf");

        $report_name = RP_REPORT . $report;
        $ctx = java_context()->getServletContext();
        $birtReportEngine = java("org.eclipse.birt.php.birtengine.BirtEngine")->getBirtEngine($ctx);
        java_context()->onShutdown(java("org.eclipse.birt.php.birtengine.BirtEngine")->getShutdownHook());

        try{

            $connect = new Java("connectDb");

            $report = $birtReportEngine->openReportDesign($report_name);
            $task = $birtReportEngine->createRunAndRenderTask($report);

            foreach ($param as $key => $value) {
                $task->setParameterValue($key, new java("java.lang.String",$value));
            }

            $taskOptions = new java("org.eclipse.birt.report.engine.api.PDFRenderOption");
            $outputStream = new java("java.io.ByteArrayOutputStream");
            $taskOptions->setOutputStream($outputStream);
            $taskOptions->setOutputFormat("pdf");

            $task->setRenderOption( $taskOptions );
            $task->getAppContext()->put("OdaJDBCDriverPassInConnection", $connect->getConnection(SERVEUR, BDD_PORT, BDD, LOGIN_DB, PWS_DB));
            $task->run();
            $task->close();


        } catch (JavaException $e) {

            echo $e; //"Error Calling BIRT";
        }

        echo java_values($outputStream->toByteArray());

    }
}
?>

This works fine unless $param contains parameters that contain non-ASCII characters. When $param does contain parameters that contain non-ASCII characters, no report is generated.

The encoding of $param is unknown.


Solution

  • The default encoding of Java Bridge is "utf-8". Therefore strings need to be encoded to UTF-8.

    foreach ($param as $key => $value) {
                $utf_8_value = mb_convert_encoding($report_name, "utf-8")
                $task->setParameterValue($key, new java("java.lang.String", $utf_8_value));
            }
    

    If the elements of $param are not iso-8895-1 encoded, set the third option of mb_convert_encoding to the appropriate encoding