COLDFUSION应用从Word/Outlook复制内容粘贴提交后出现问号问题
问题根因说明
你遇到的从Office复制内容存库后显示问号的问题,本质是字符集链路不兼容导致的:Word/Outlook的内容默认带大量Windows-1252编码的特殊字符(比如弯引号、长破折号、非打断空格等),如果前端页面、ColdFusion服务、数据库连接、数据库本身的字符集没有统一用UTF-8,这些特殊字符在转码过程中就会被替换为问号。直接过滤删除字符属于兜底方案,优先建议先排查全链路字符集配置。
第一步:优先排查全链路编码配置
- 前端页面:确认所有提交评论的页面头部加入
<meta charset="UTF-8">,表单可以额外加accept-charset="UTF-8"属性强制提交编码 - ColdFusion服务:进入CF管理员后台,在「服务器设置 > Settings」中把「File Encoding」设置为UTF-8,同时给CF对应的JVM启动参数添加
-Dfile.encoding=UTF8,重启CF服务生效 - 数据库侧:
- 如果用SQL Server,存储评论的字段要改为
NVARCHAR/NTEXT类型,VARCHAR默认仅支持ASCII扩展编码,存Unicode字符会自动转问号 - 如果用MySQL,数据库/表/字段的字符集统一设为
utf8mb4(支持全量Unicode包括emoji)
- 如果用SQL Server,存储评论的字段要改为
- 数据库连接串:在CF的数据源配置中,给连接串添加编码参数,比如MySQL的连接串追加
useUnicode=true&characterEncoding=UTF-8
第二步:优化字符清理逻辑(兜底方案)
你当前的代码存在两个问题:一是把Replace当正则替换用(Replace仅做精确字符串匹配,正则替换需要用ReReplace);二是直接删除所有非ASCII字符会丢失合法内容,建议先做常用Office特殊字符映射,再过滤非法字符。
优化后的参考代码如下:
str = RemoveHTML(str); // 先替换Office常见特殊字符为可兼容的普通字符 // 替换非打断空格为普通空格 str = Replace(str, Chr(160), " ", "All"); // 替换弯引号为直引号 str = Replace(str, Chr(8220), """", "All"); str = Replace(str, Chr(8221), """", "All"); str = Replace(str, Chr(8216), "'", "All"); str = Replace(str, Chr(8217), "'", "All"); // 替换长短破折号为普通横杠 str = Replace(str, Chr(8211), "-", "All"); str = Replace(str, Chr(8212), "-", "All"); // 替换制表符、换行符为空格 str = Replace(str, Chr(9), " ", "All"); str = Replace(str, Chr(10), " ", "All"); str = Replace(str, Chr(13), " ", "All"); // 正则过滤所有非ASCII可打印字符,注意这里用ReReplace str = ReReplace(str, "[^\x20-\x7E]", "", "ALL"); // 合并多空格为单空格 str = ReReplaceNoCase(str, "[[:blank:]]{2,}", " ", "All"); str = Trim(str); str = Left(str, 5000); return str;
内容的提问来源于stack exchange,提问作者Scott
相关产品推荐
相关产品推荐

