【问题标题】:Correct character encoding when calling BIRT using Java Bridge in PHP在 PHP 中使用 Java Bridge 调用 BIRT 时正确的字符编码
【发布时间】:2016-04-28 16:16:23
【问题描述】:

我正在调用 BIRT 以通过 Java Bridge 生成 PDF 报告:

<?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());

    }
}
?>

除非$param 包含包含非ASCII 字符的参数,否则这工作正常。当$param 确实包含包含非ASCII 字符的参数时,不会生成报告。

$param的编码未知。

【问题讨论】:

  • 你是说当$birtReportEngine-&gt;openReportDesign($report_name);包含非ASCII时,结果不会返回到屏幕上?你会收到 500 错误吗?
  • 当发送到 BIRT 的参数包含非 ASCII 时,我无法打开 pdf 文件。
  • $report_name 是文件名吗?那么当文件名包含非 ASCII 字符时呢?
  • $report_name 是具有 .rptdesign 扩展名的 BIRT 报告的文件名,即使此文件名包含所有 ASCII 字符也会出现问题。
  • 但是你说“重音字母不能打开报告”!? “强调”是非 ASCII。你能澄清一下吗?

标签: java php character-encoding birt php-java-bridge


【解决方案1】:

使用 latin_swedish 代替 UTF-8

【讨论】:

  • 我应该在哪里指定它?你能提供一个代码吗?
  • 在顶部添加:default_charset();
  • 我用这个header("Content-type: application/pdf; charset=utf-8");修改了表头代码,但是报表打不开!
  • @TechnicCoder2000,我假设使用“latin_swedish”,您认为这是与 MySQL 相关的问题吗?如果是这样,我认为你的做法是错误的
  • 当然...我真的知道你在说什么,所以我想表现得很好并尝试找到正确的答案
【解决方案2】:

Java Bridge 的默认编码是“utf-8”。因此字符串需要编码为 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));
        }

如果$param的元素没有iso-8895-1编码,则将mb_convert_encoding的第三个选项设置为合适的编码

【讨论】:

  • $report_name 没有问题,但 $param 参数。
  • 请看我的更新,它编码了$param的元素
猜你喜欢
  • 1970-01-01
  • 2010-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多