<!--配置中文乱码的过滤器  -->

本文介绍了一种解决中文乱码问题的方法,通过配置自定义的EncodingFilter来确保所有请求都使用统一的字符集,避免因字符编码不一致导致的问题。
<!--配置中文乱码的过滤器  -->
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.hanqing.web.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

&lt;template&gt; &lt;view class="detail-container"&gt; &lt;view class="detail-title"&gt;{{ detail.title }}&lt;/view&gt; &lt;view class="detail-date"&gt;发布日期:{{ formatDate(detail.publishDate) }}&lt;/view&gt; &lt;!-- 使用处理后的富文本内容 --&gt; &lt;rich-text class="detail-content" :nodes="parseContent(detail.content)" /&gt; &lt;/view&gt; &lt;/template&gt; &lt;script setup&gt; import { ref } from 'vue'; import { onLoad } from '@dcloudio/uni-app'; const detail = ref({ title: '', publishDate: '', content: '' }); onLoad((options) =&gt; { if (options && options.articleId) { fetchDetail(options.articleId); } else { uni.showToast({ title: '缺少文章ID', icon: 'error' }); } }); // 格式化日期 const formatDate = (dateStr) =&gt; { if (!dateStr) return ''; const date = new Date(dateStr); return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`; }; // 增强的富文本处理函数 const parseContent = (html) =&gt; { if (!html) return ''; // 1. 处理转义字符 let processedHtml = html .replace(/&lt;/g, '&lt;') .replace(/&gt;/g, '&gt;') .replace(/&/g, '&') .replace(/"/g, '"') .replace(/&apos;/g, "'") .replace(/'/g, "'") .replace(/&nbsp;/g, ' '); // 2. 处理图片自适应 processedHtml = processedHtml.replace( /&lt;img[^&gt;]+src="([^"]+)"[^&gt;]*&gt;/gi, (match, src) =&gt; { return `&lt;img src="${src}" style="max-width:100%;height:auto;display:block;margin:10px auto;border-radius:8px;" /&gt;`; } ); // 3. 处理段落首行缩进 processedHtml = processedHtml.replace( /&lt;p[^&gt;]*&gt;/gi, '&lt;p style="text-indent:2em;margin:15px 0;"&gt;' ); // 4. 处理特殊符号(如百分号、括号等) processedHtml = processedHtml .replace(/%/g, '%') // 中文全角百分号 .replace(/\(/g, '(') // 中文全角左括号 .replace(/\)/g, ')'); // 中文全角右括号 // 5. 处理加粗字体 processedHtml = processedHtml.replace( /&lt;strong&gt;(.*?)&lt;\/strong&gt;/gi, '&lt;strong style="font-weight:bold;color:#333;"&gt;$1&lt;/strong&gt;' ); // 6. 处理列表样式 processedHtml = processedHtml .replace(/&lt;ol&gt;/gi, '&lt;ol style="padding-left:40px;margin:10px 0;"&gt;') .replace(/&lt;ul&gt;/gi, '&lt;ul style="padding-left:40px;margin:10px 0;"&gt;') .replace(/&lt;li&gt;/gi, '&lt;li style="margin-bottom:8px;"&gt;'); return processedHtml; }; // 获取详情数据 const fetchDetail = async (id) =&gt; { try { uni.showLoading({ title: '加载中...', mask: true }); const res = await uni.request({ url: `/api/incorruptFront/frontArticleDet/${id}`, method: 'GET' }); // 兼容不同平台响应结构 const response = res[1] || res; if (response.data && response.data.code === 200) { detail.value = response.data.data; } else { throw new Error(response.data?.msg || '数据加载失败'); } } catch (error) { uni.showToast({ title: error.message || '网络请求失败', icon: 'none' }); } finally { uni.hideLoading(); } }; &lt;/script&gt; &lt;style scoped&gt; .detail-container { padding: 30rpx; background-color: #fff; line-height: 1.8; } .detail-title { font-size: 40rpx; font-weight: bold; margin-bottom: 20rpx; color: #333; text-align: center; line-height: 1.5; } .detail-date { font-size: 26rpx; color: #999; margin-bottom: 40rpx; text-align: center; } /* 富文本内容样式增强 */ .detail-content { font-size: 30rpx; color: #555; text-align: left; /* 全局段落样式 */ :deep(p) { margin: 20rpx 0; line-height: 1.8; } /* 图片样式 */ :deep(img) { border-radius: 12rpx; margin: 30rpx auto; box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.1); background-color: #f8f8f8; } /* 加粗文本 */ :deep(strong) { color: #333; font-weight: bold; } /* 列表样式 */ :deep(ol), :deep(ul) { padding-left: 50rpx; margin: 20rpx 0; } :deep(li) { margin-bottom: 15rpx; line-height: 1.6; } /* 特殊符号处理 */ :deep(*) { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; } } &lt;/style&gt; 这个是我详情页代码,接口中的content内容是后端转译过的的数据内容,后端转译部分代码如下:package com.qiya.incorruptible.config; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; /** * Jackson 配置类:支持特殊字符解析(如 HTML 标签、图片地址等) */ @Configuration public class JacksonConfig { @Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { // 创建 ObjectMapper 实例(Jackson 核心处理类) ObjectMapper objectMapper = new ObjectMapper(); // 1. 配置特殊字符解析(兼容各版本 Jackson) try { // 尝试高版本配置(Jackson 2.10+) Class&lt;?&gt; jsonReadFeatureClass = Class.forName("com.fasterxml.jackson.core.json.JsonReadFeature"); Object allowUnescapedControlChars = jsonReadFeatureClass.getField("ALLOW_UNESCAPED_CONTROL_CHARS").get(null); // 调用 enable 方法启用特性 objectMapper.getClass().getMethod("enable", jsonReadFeatureClass).invoke(objectMapper, allowUnescapedControlChars); } catch (Exception e1) { try { // 尝试低版本配置(Jackson 2.9及以下) JsonParser.Feature feature = JsonParser.Feature.valueOf("ALLOW_UNESCAPED_CONTROL_CHARS"); objectMapper.enable(feature); } catch (Exception e2) { // 若仍失败,尝试兼容低版本拼写(少一个 "E") try { JsonParser.Feature feature = JsonParser.Feature.valueOf("ALLOW_UNQUOTED_CONTROL_CHARS"); objectMapper.enable(feature); } catch (Exception e3) { // 所有尝试失败时,打印警告(不影响其他配置) System.err.println("警告:无法启用特殊字符解析,可能导致富文本解析失败"); } } } // 2. 允许单引号(如 {'name': 'value'}) objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); // 3. 允许 JSON 中的注释(/* 注释内容 */ 或 // 单行注释) objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true); // 4. 允许未加引号的字段名(如 {name: 'value'}) objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); // 5. 忽略实体类中不存在的字段(避免前端多传字段导致解析失败) objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 6. 实体类为空时不报错(避免无字段时的异常) objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS); // 创建并返回自定义消息转换器 return new MappingJackson2HttpMessageConverter(objectMapper); } } 这导致后端里的content内容是常见文章内容有特殊符号,有照片,字体有加粗等。但是我这个页面显示有一部分是乱码。就比如后端数据是:第一行:你好(加粗)下一行是:我是(前面空了两个字的间距),第三行是一张图片在线调查_20250821162526A015.png。后端返回的数据就会是:"content": "&lt;p&gt;&lt;strong&gt;你好&lt;/strong&gt;&lt;/p&gt;&lt;p&gt; 我是&lt;/p&gt;&lt;p&gt;&lt;img src=\"http://172.26.26.34:9300/statics/2025/08/21/在线调查_20250821162526A015.png\"&gt;&lt;/p&gt;",
最新发布
08-22
&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"&gt; &lt;display-name&gt;AirlineBooking&lt;/display-name&gt; &lt;welcome-file-list&gt; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt; &lt;/welcome-file-list&gt; &lt;!-- 配置JSTL --&gt; &lt;jsp-config&gt; &lt;taglib&gt; &lt;taglib-uri&gt;http://java.sun.com/jsp/jstl/core&lt;/taglib-uri&gt; &lt;taglib-location&gt;/WEB-INF/lib/jstl-1.2.jar&lt;/taglib-location&gt; &lt;/taglib&gt; &lt;/jsp-config&gt; &lt;filter&gt; &lt;filter-name&gt;AuthFilter&lt;/filter-name&gt; &lt;filter-class&gt;com.airline.filter.AuthFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;AuthFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/booking/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;AuthFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/user/*&lt;/url-pattern&gt; &lt;/filter-mapping&gt; &lt;!-- &lt;!– 应用显示名称 –&gt;--&gt; &lt;!-- &lt;display-name&gt;OnlineShop&lt;/display-name&gt;--&gt; &lt;!-- &lt;!– 欢迎文件列表 –&gt;--&gt; &lt;!-- &lt;welcome-file-list&gt;--&gt; &lt;!-- &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;--&gt; &lt;!-- &lt;/welcome-file-list&gt;--&gt; &lt;!-- &lt;!– 会话超时配置(单位:分钟) –&gt;--&gt; &lt;!-- &lt;session-config&gt;--&gt; &lt;!-- &lt;session-timeout&gt;30&lt;/session-timeout&gt;--&gt; &lt;!-- &lt;/session-config&gt;--&gt; &lt;!-- &lt;!– Servlet 配置&gt;--&gt; &lt;!-- &lt;servlet&gt;--&gt; &lt;!-- &lt;servlet-name&gt;LoginServlet&lt;/servlet-name&gt;--&gt; &lt;!-- &lt;servlet-class&gt;com.onlineshop.servlet.LoginServlet&lt;/servlet-class&gt;--&gt; &lt;!-- &lt;/servlet&gt;--&gt; &lt;!-- &lt;servlet&gt;--&gt; &lt;!-- &lt;servlet-name&gt;RegisterServlet&lt;/servlet-name&gt;--&gt; &lt;!-- &lt;servlet-class&gt;com.example.onlineshop.servlet.RegisterServlet&lt;/servlet-class&gt;--&gt; &lt;!-- &lt;/servlet&gt;--&gt; &lt;!-- &lt;!– Servlet 映射 –&gt;--&gt; &lt;!-- &lt;servlet-mapping&gt;--&gt; &lt;!-- &lt;servlet-name&gt;LoginServlet&lt;/servlet-name&gt;--&gt; &lt;!-- &lt;url-pattern&gt;/login_process.jsp&lt;/url-pattern&gt;--&gt; &lt;!-- &lt;/servlet-mapping&gt;--&gt; &lt;!-- &lt;servlet-mapping&gt;--&gt; &lt;!-- &lt;servlet-name&gt;RegisterServlet&lt;/servlet-name&gt;--&gt; &lt;!-- &lt;url-pattern&gt;/register_process.jsp&lt;/url-pattern&gt;--&gt; &lt;!-- &lt;/servlet-mapping&gt;--&gt; &lt;!-- &lt;!– 错误页面配置&gt;--&gt; &lt;!--&lt;!&lt;error-page&gt;–&gt;--&gt; &lt;!--&lt;!&lt;error-code&gt;404&lt;/error-code&gt;–&gt;--&gt; &lt;!--&lt;!&lt;location&gt;/error/404.jsp&lt;/location&gt;–&gt;--&gt; &lt;!--&lt;!&lt;/error-page&gt;–&gt;--&gt; &lt;!--&lt;!&lt;error-page&gt;–&gt;--&gt; &lt;!--&lt;!&lt;error-code&gt;500&lt;/error-code&gt;–&gt;--&gt; &lt;!--&lt;!&lt;location&gt;/error/500.jsp&lt;/location&gt;–&gt;--&gt; &lt;!--&lt;!&lt;/error-page&gt;–&gt;--&gt; &lt;!-- &lt;!– 上下文参数 –&gt;--&gt; &lt;!-- &lt;context-param&gt;--&gt; &lt;!-- &lt;param-name&gt;jdbcDriver&lt;/param-name&gt;--&gt; &lt;!-- &lt;param-value&gt;com.mysql.jdbc.Driver&lt;/param-value&gt;--&gt; &lt;!-- &lt;/context-param&gt;--&gt; &lt;!-- &lt;context-param&gt;--&gt; &lt;!-- &lt;param-name&gt;jdbcUrl&lt;/param-name&gt;--&gt; &lt;!-- &lt;param-value&gt;jdbc:mysql://localhost:3306/onlineshop&lt;/param-value&gt;--&gt; &lt;!-- &lt;/context-param&gt;--&gt; &lt;!-- &lt;!过滤器配置(可选) –&gt;--&gt; &lt;!--&lt;!&lt;filter&gt;–&gt;--&gt; &lt;!--&lt;!&lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;–&gt;--&gt; &lt;!--&lt;!&lt;filter-class&gt;com.example.onlineshop.filter.CharacterEncodingFilter&lt;/filter-class&gt;–&gt;--&gt; &lt;!--&lt;!&lt;init-param&gt;–&gt;--&gt; &lt;!--&lt;!&lt;param-name&gt;encoding&lt;/param-name&gt;–&gt;--&gt; &lt;!--&lt;!&lt;param-value&gt;UTF-8&lt;/param-value&gt;–&gt;--&gt; &lt;!--&lt;!&lt;/init-param&gt;–&gt;--&gt; &lt;!--&lt;!&lt;/filter&gt;–&gt;--&gt; &lt;!--&lt;!&lt;filter-mapping&gt;–&gt;--&gt; &lt;!--&lt;!&lt;filter-name&gt;CharacterEncodingFilter&lt;/filter-name&gt;–&gt;--&gt; &lt;!--&lt;!&lt;url-pattern&gt;/*&lt;/url-pattern&gt;–&gt;--&gt; &lt;!--&lt;!&lt;/filter-mapping&gt;–&gt;--&gt; &lt;/web-app&gt;我这个配置有问题吗
06-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值