如何用JavaScript将混合非拉丁字符及特殊符号写入RTF文件
解决混合语言+特殊符号的RTF占位符替换编码问题
问题背景
- 需求:将包含英文、特殊符号Ø、俄文的文本「Abc Ø абв」替换现有RTF模板中的占位符
- 问题:使用
utf8_decode_to_win1251函数将UTF-8转Win-1251编码时,俄文显示正常,但特殊符号Ø被错误转为Ш;无法通过单一Win-1251或Win-1252编码处理这类混合文本
解决方案
利用RTF原生的Unicode表示规则(格式为\uXXXX?,其中XXXX是字符的Unicode码点),编写转换函数将所有字符统一转为该格式,避免编码冲突问题。
示例转换效果:Abc Ø абв → \u65?\u98?\u99?\u32?\u216?\u32?\u1072?\u1073?\u1074?
代码实现
原问题转码函数
// 原存在问题的转码函数 function utf8_decode_to_win1251(srcStr) { var tgtStr = "", c = 0; for (var i = 0; i < srcStr.length; i++) { c = srcStr.charCodeAt(i); if (c > 127) { if (c > 1024) { if (c === 1025) { c = 1016; } else if (c === 1105) { c = 1032; } c -= 848; } } tgtStr += String.fromCharCode(c); } return tgtStr; }
最终解决函数
// 最终解决函数 function unicode_to_rtf_representation_u(srcStr) { if (srcStr == undefined) return ""; let tgtStr = ""; for (var i = 0; i < srcStr.length; i++) { let c = srcStr.charCodeAt(i); let result = "\\u" + c + "?"; tgtStr += result; } console.log("result strings is: " + tgtStr); return tgtStr; }
完整Node.js示例代码
const http = require('http'); const port = 3100; const server = http.createServer(function (req, res) { const fs = require('fs'); fs.readFile("C:\\input.rtf", "utf8", (err, inputText) => { if (err) { console.error(err); return; } let text = `Abc Ø абв`; text = unicode_to_rtf_representation_u(text); inputText = inputText.replace("placeholder", text); let buf = Buffer.from(inputText, "ascii"); fs.writeFile("C:\\output.rtf", buf, function (error, resultFile) { if (!error) { console.info('Created file', resultFile); } else { console.error(error); } }); }); }); server.listen(port, function (error) { if (error) { console.log(`${error}`); } else { console.log(`listening on port ${port}`); } })
内容的提问来源于stack exchange,提问作者Gennady G
相关产品推荐
相关产品推荐

