当前位置: 首页 > 知识库问答 >
问题:

JasperReport CSV UTF-8没有BOM而不是UTF-8

赖杰
2023-03-14

我尝试用JasperReport导出CSV文件,问题是当我想打印像“€”这样的货币时。

当我搜索解决方案时,我意识到这是关于文件编码的!我写这个代码

//JasperPrint is already filled

HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.setContentType("application/csv; charset="+Charset.forName("utf-8").displayName());
httpServletResponse.setCharacterEncoding(Charset.forName("utf-8").displayName());
httpServletResponse.addHeader("Content-disposition", "attachment; filename=nameoffile.csv");
httpServletResponse.addHeader("Content-type", "application/csv; charset="+Charset.forName("utf-8").displayName());
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JRCsvExporter exporter = new JRCsvExporter();

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, Charset.forName("utf-8").displayName());
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, servletOutputStream);
exporter.setParameter(JRCsvExporterParameter.CHARACTER_ENCODING, Charset.forName("utf-8").displayName());
exporter.setParameter(JRCsvExporterParameter.FIELD_DELIMITER, ";");

JasperReport导出的文件编码在“没有BOM的UTF-8”上。所以当我用Excel打开文件时,“€”看起来像“,”。但是当我用记事本打开文件时,“€”看起来像“€”。

在记事本上,我将文件编码转换为UTF-8(我认为是BOM),我保存文件。我用Excel打开文件,然后---EUREKA---, '€' 看起来像€。

所以主要问题是如何将文件编码到“UTF-8 with BOM”?

更新

我尝试使用jrxml

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report2" language="groovy" pageWidth="100" pageHeight="842" columnWidth="100" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="b7ec44fd-90d0-4ecc-8f99-0e5eafc16828">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <parameter name="toPrint" class="java.lang.String"/>
    <title>
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="100" height="20" uuid="d2c55a11-b407-407b-b117-3b04d20cccec"/>
                <textFieldExpression><![CDATA[$P{toPrint}]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

我将toPrint=€€€€€€€€€€€€设置为预览。PDF工作正常,但当我将文件保存到CSV时,我会看到“文件”

共有2个答案

孔权
2023-03-14

而不是解决您的编码问题您可以考虑使用不同的符号

编写包含特殊字符的代码通常是不好的做法(在输出文件上切换编码或使用期望不同编码ecc的编译器编译代码),会损坏结果

UTF-8编码的任何字符只能用其4位十六进制代码表示

欧元是20美分

因此,不要把<代码>欧元>代码>你可以考虑在你的JRXML代码中放<代码> \u20ac 。

实例

<textField>
    <reportElement x="0" y="0" width="100" height="25" uuid="bc2ae040-f9af-4732-82fe-8fe8b71696bd"/>
    <textFieldExpression><![CDATA["\u20AC"]]></textFieldExpression>
</textField>

编辑:在注释“但是,我要打印的值不是静态值”之后,将该值转换为unicode:

java代码示例

public static String getAsUnicode(String value){
    if (value==null){
        return null;
    }
    String ret = "";
    for (char ch : value.toCharArray()) {
        ret += getUnicodeEscaped(ch);
    }
    return ret;
}

public static String getUnicodeEscaped(char ch) {
      if (ch < 0x10) {
          return "\\u000" + Integer.toHexString(ch);
      } else if (ch < 0x100) {
          return "\\u00" + Integer.toHexString(ch);
      } else if (ch < 0x1000) {
          return "\\u0" + Integer.toHexString(ch);
      }
      return "\\u" + Integer.toHexString(ch);
  }

在jrxml中调用您的方法

<textField>
    <reportElement x="0" y="0" width="100" height="25" uuid="bc2ae040-f9af-4732-82fe-8fe8b71696bd"/>
    <textFieldExpression><![CDATA[MyClass.getAsUnicode($P{toPrint})]]></textFieldExpression>
</textField>
汲昊空
2023-03-14

经过搜索,我找到了一个解决方案:使用cp1252编码,它注意到了“€”符号!最后的代码是贝娄!

//JasperPrint is already filled

HttpServletResponse httpServletResponse = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
httpServletResponse.setContentType("application/csv; charset=cp1252");
httpServletResponse.setCharacterEncoding("cp1252");
httpServletResponse.addHeader("Content-disposition", "attachment; filename=nameoffile.csv");
httpServletResponse.addHeader("Content-type", "application/csv; charset="+Charset.forName("utf-8").displayName());
ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
JRCsvExporter exporter = new JRCsvExporter();

exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING, "cp1252");
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, servletOutputStream);
exporter.setParameter(JRCsvExporterParameter.CHARACTER_ENCODING, "cp1252");
exporter.setParameter(JRCsvExporterParameter.FIELD_DELIMITER, ";");
 类似资料:
  • 问题内容: 这里有两个问题。我有一组通常是带有BOM的UTF-8文件。我想将它们(理想情况下)转换为没有BOM的UTF-8。似乎可以解决这个问题。但是我真的看不到任何有关用法的好例子。这将是处理此问题的最佳方法吗? 同样,如果我们能够处理清楚知道的不同输入编码(看到的ASCII和UTF-16),那将是理想的。看来这一切都是可行的。是否有一种解决方案可以采用任何已知的Python编码并以UTF-8格

  • 我构建了一个System类型的XML对象。Xml。XmlDocument。 我使用保存()方法将其保存到文件中。 这会将文件以UTF-8格式与BOM一起保存。BOM表会导致后续的其他脚本出现问题。 当我们在记事本中打开XML文件并将其保存为UTF-8(没有BOM)时,其他脚本不会有问题。所以我被要求保存没有BOM的脚本。 保存方法的MS文档说明: encoding属性的值取自XmlDeclarat

  • 我正在用UTF-8和Qt做实验,遇到了一个奇怪的问题,所以我调查了一下。我创建了一个简单的程序,打印字节文字: 如果我们使用BOM将文件保存为UTF-8,然后从Visual Studio 2015运行它,则将打印此文件: 虽然我真的不明白第一个字符串是从哪里来的,但根据UTF-8编码表,第二个字符串正是应该的。 如果将完全相同的代码保存为UTF-8而不包含BOM,则这是输出: 因此,虽然它导致未固

  • 问题内容: 我正在通过FileReader读取文件-该文件已经过UTF-8解码(使用BOM),现在的问题是:我读取了文件并输出了字符串,但可悲的是BOM表标记也被输出了。为什么会这样? 第一行后输出 问题答案: http://www.rgagnon.com/javadetails/java-handle-utf8-file-with-bom.html

  • 我已经被困在导出UTF-8 CSV与Windows Excel上显示乱码文本的汉字好几天了。我使用PHP,已经添加了BOM字节标记,并尝试编码,但没有运气。 它们在记事本、谷歌电子表格甚至Mac数字上都能很好地打开。但不是在客户要求的Excel上。使用记事本打开时,编码显示为UTF-8。如果我手动将其更改为UTF-8并保存,该文件将在Excel上正常打开。 似乎BOM字节标记不会保存在输出中,因为

  • 我正在尝试使用iconv将UTF-16BE编码文件(字节顺序标记:0xFE 0xFF)转换为UTF-8,如下所示: 然而,结果输出具有UTF-8字节顺序标记(0xEF 0xBB 0xBF),这不是我需要的。有没有办法告诉iconv(或者有等效的编码)不要在UTF-8结果中放入BOM?