将非拉丁字符和特殊符号 (Ø) 写入 RTF 文件 (javascript)

Write non-latin characters and special symbols (Ø) to RTF file (javascript)

提问人:Gennady G 提问时间:9/27/2023 最后编辑:Gennady G 更新时间:9/30/2023 访问量:60

问:

更新:

是的,非常感谢你的想法! 你是对的,有编码的混搭,我无法在 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 Ø абв”替换这个“占位符”:enter image description here

我从这里使用页面底部的函数将 UTF-8 解码为 Win-1251 - 它成功地写了俄语字母,但最后我得到了“Ш”而不是“Ø”:

enter image description here

以下是我的示例代码以及输入和输出文件:

输入 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}`);
  }
})
JavaScript Unicode 编码 RTF Windows-1251

评论

0赞 ControlAltDel 9/27/2023
这回答了你的问题吗?在 RTF 中指定 utf-8 字符编码?文本(UTF-8)格式在Sqlite中正确显示
0赞 Gennady G 9/27/2023
我看到了这个帖子。 不完全是..
1赞 satesrah 9/28/2023
您是否从 utf8 解码为 win1252 而不是 win1251?我认为win1251中没有Ø。
0赞 Gennady G 9/29/2023
谢谢satesah!看起来编码功能没问题,我得到的结果为“Abc Ø àáâ”。但是当转换为此字符串中的二进制数据时,我可能会丢失这个符号“Ø”:let buf = Buffer.from(inputText, “ascii”);不知道如何解决它..所有其他缓冲区编码选项也会给出错误的结果。.

答:

1赞 satesrah 9/29/2023 #1

我认为你不能用 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 B241 62 63 D8 E0 E1 E2

评论

0赞 Gennady G 9/30/2023
是的,你是对的,satesrah。更新了我的帖子。 谢谢!最好的问候,根纳季