提问人:Gennady G 提问时间:9/27/2023 最后编辑:Gennady G 更新时间:9/30/2023 访问量:60
将非拉丁字符和特殊符号 (Ø) 写入 RTF 文件 (javascript)
Write non-latin characters and special symbols (Ø) to RTF file (javascript)
问:
更新:
是的,非常感谢你的想法! 你是对的,有编码的混搭,我无法在 Win-1251 或 Win-1252 中转换整个文本。
我不想在此文件中插入 unicode 并保留使用单一编码,但我看到的唯一方法是使用诸如 \u1234?之类的符号转换所有文本。所以创建了这个函数:
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;
}
它的作用类似于
Abc Ø абв --> \u65?\u98?\u99?\u32?\u216?\u32?\u1072?\u1073?\u1074?
这有效..
再次感谢你!
您能否帮助 mу 如何编码非拉丁(俄语)字母,这些字母与特殊符号混合,例如:(这里是英文文本、特殊符号“拉丁文 o”和俄文文本)。Abc Ø абв
我有现有的 RTF 模板,里面有“占位符”文本,我需要的是用“Abc Ø абв”替换这个“占位符”:
我从这里使用页面底部的函数将 UTF-8 解码为 Win-1251 - 它成功地写了俄语字母,但最后我得到了“Ш”而不是“Ø”:
以下是我的示例代码以及输入和输出文件:
输入 RTF:https://mega.nz/file/CtNB2CiY#yid1nLq9P6Jo8zSRAsXeGai-mZLV6xP1OvN1jDpFyG4
输出 RTF 生成的代码如下: https://mega.nz/file/asMExKJI#q8oRn1J9oWMlUck6tJ6MdpVGiIjt81kNFRo7T3eSBTU
const http = require('http');
const port = 3100;
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;
}
// c = c % 256; // ???
}
tgtStr += String.fromCharCode(c);
}
return tgtStr;
}
const server = http.createServer(function (req, res) {
const fs = require('fs');
// read existing file
fs.readFile("C:\input.rtf", "utf8", (err, inputText) => {
if (err) {
console.error(err);
return;
}
// I want to replace 'placeholder' text in file with this test text:
let text = `Abc Ø абв`; // 'Abc Ø абв'
text = utf8_decode_to_win1251(text); // text with encoded russian letters 'Abc Ø àáâ'
// replace placeholder from input RTF with text with non-latin characters 'Abc Ø àáâ':
inputText = inputText.replace("placeholder", text);
// RTF uses 8-bit so need to convert from unicode
let buf = Buffer.from(inputText, "ascii"); // "binary" also gives wrong output text https://stackoverflow.com/a/34476862/348736
// write output file to disk
fs.writeFile("C:\output.rtf", buf, function (error, resultFile) { // result file contains 'Abc Ш абв', which is wrong..
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}`);
}
})
答:
我认为你不能用 8 位编码表示“Abc Ø абв”。至少据我所知。
我试图理解你的代码中发生的事情。问题是在 Windows-1251 中没有字符 Ø,您可以在此表 https://www.ascii-code.com/CP1251 中进行检查。在 Windows-1251 中,字符 aбв 确实存在。因此,该函数实际生成 Windows-1251 是没有意义的。但是,如果您尝试将“Abc Ø абв”转换为 Windows-1252,您会发现 Windows-1252 确实有字符 Ø,但没有 абв(这里的 a 是西里尔字母 a,与拉丁语 a 不同)。我认为正在发生的事情是,您解码为 Windows-1252,但数据最终出现在应该是 Windows-1251 的某个地方。
通过以下方式播放:
“Abc Ø абв”翻译为十六进制 (utf-8) 。尝试将其解码为 Windows-1252 会得到 .
打印出“Abc Ø àáâ”,这正是你所得到的。
如果随后将同一十六进制的编码从 Windows-1252 更改为 Windows-1251,则会打印“Abc Ш абв”。这又是你的例子中发生的事情。
(你可以在这里尝试一下 https://www.rapidtables.com/convert/number/hex-to-ascii.html)。41 62 63 C3 98 D0 B0 D0 B1 D0 B2
41 62 63 D8 E0 E1 E2
评论