You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Thymeleaf+Spring中含HTML特殊字符的客户端名称换行问题

解决方案

核心问题分析

你之前的处理顺序完全搞反了:先添加<br>再转义,导致<br>被转成了&lt;br&gt;,不管是HTML还是PDF都无法识别为换行。正确的逻辑应该是先转义HTML特殊字符,再插入换行标签。

方案一:Java代码端处理

  1. 优先转义原始字符串中的HTML特殊字符,避免破坏后续的HTML结构
  2. 对转义后的字符串,每12个字符插入<br>标签
  3. 模板中直接用th:utext渲染即可

示例代码:

// 原始客户端名称
String originalClient = "INVC _Client01 _Abcde_lkgyiop_ Kamal_nagar\"&'<>]a";

// 第一步:转义HTML特殊字符
String escapedClient = StringEscapeUtils.escapeHtml4(originalClient);

// 第二步:每12字符插入<br>标签
String formattedClient = escapedClient.replaceAll("(.{12})", "$1<br>");

// 将formattedClient传入模板,模板中用th:utext="${formattedClient}"渲染

处理后各阶段结果:

  • 转义后:INVC _Client01 _Abcde_lkgyiop_ Kamal_nagar&quot;&amp;&#39;&lt;&gt;]a
  • 添加<br>后:INVC _Client<br>01 _Abcde_lk<br>gyiop_ Kamal<br>_nagar&quot;&amp;<br>&#39;&lt;&gt;]a
    模板用th:utext渲染后,HTML会正确解析<br>为换行,特殊字符也能正常显示,主流PDF生成工具也能识别该标签实现换行。

方案二:Thymeleaf模板端处理

如果不想在Java代码中处理,也可以在模板中完成转义+换行插入的流程:

<td>
    <div th:with="escapedClient=${#strings.escapeXml(row.get('client'))}">
        <div th:utext="${escapedClient.replaceAll('(.{12})', '$1<br/>')}"></div>
    </div>
</td>
  • 先用#strings.escapeXml转义HTML特殊字符(效果和StringEscapeUtils.escapeHtml4一致)
  • 再对转义后的字符串执行替换,插入<br>标签
  • 最后用th:utext渲染,确保<br>被解析为换行

PDF适配补充

如果PDF生成工具(如Flying Saucer)仍不识别<br>,可以尝试两种替代方案:

  • 用CSS设置容器的white-space: pre-line,然后将<br>替换为换行符\n(Java或模板中替换时用$1\n)
  • 把每段12字符的内容包裹在<p>标签中,利用段落自动换行:
    // Java端替换为<p>标签
    String formattedClient = escapedClient.replaceAll("(.{12})", "<p>$1</p>");
    

内容的提问来源于stack exchange,提问作者Jagga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:12:16