如何在 JavaScript 中生成 Shift_JIS(SJIS) 百分比编码字符串

How to generate a Shift_JIS(SJIS) percent encoded string in JavaScript

我是 JavaScript 和 Google Apps 脚本的新手,在将单元格中的文本转换为 Shift-JIS (SJIS) 编码字母时遇到了问题。 例如,日文字符串“あいう”应该编码为“%82%A0%82%A2%82%A4”而不是“%E3%81%82%E3%81%84%E3%81%86”是 UTF-8 编码的。

我尝试了 EncodingJS 和内置的 urlencode() 函数,但它们都是 returns UTF-8 编码的函数。

谁能告诉我如何在 GAS 中正确获取 SJIS 编码的字母?谢谢。

  • 您想将 URL 从 あいう 编码到 %82%A0%82%A2%82%A4 作为字符集的 Shift-JIS
    • %E3%81%82%E3%81%84%E3%81%86是转换为UTF-8.
    • 的结果
  • 您想使用 Google Apps 脚本实现此目的。

如果我的理解是正确的,这个答案怎么样?请将此视为几个可能的答案之一。

这个答案的要点:

  • 为了在Google Apps Script中使用字符集Shift-JIS,需要将其作为二进制数据使用。因为,当 Shift-JIS 的值被 Google Apps 脚本检索为字符串时,字符集会自动更改为 UTF-8。请注意这一点。

示例脚本 1:

为了从あいう转换为%82%A0%82%A2%82%A4,下面的脚本怎么样?在这种情况下,此脚本可用于平假名字符。

function muFunction() {
  var str = "あいう";

  var bytes = Utilities.newBlob("").setDataFromString(str, "Shift_JIS").getBytes();
  var res = bytes.map(function(byte) {return "%" + ("0" + (byte & 0xFF).toString(16)).slice(-2)}).join("").toUpperCase();
  Logger.log(res)
}
结果:

在日志中可以看到如下结果

%82%A0%82%A2%82%A4

示例脚本 2:

如果你想转换包含KANJI字符的值,下面的脚本怎么样?在这种情况下,本日は晴天なり 转换为 %96%7B%93%FA%82%CD%90%B0%93V%82%C8%82%E8

function muFunction() {
  var str = "本日は晴天なり";
  var conv = Utilities.newBlob("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz*-.@_").getBytes().map(function(e) {return ("0" + (e & 0xFF).toString(16)).slice(-2)});
  var bytes = Utilities.newBlob("").setDataFromString(str, "Shift_JIS").getBytes();
  var res = bytes.map(function(byte) {
    var n = ("0" + (byte & 0xFF).toString(16)).slice(-2);
    return conv.indexOf(n) != -1 ? String.fromCharCode(parseInt(n[0], 16).toString(2).length == 4 ? parseInt(n, 16) - 256 : parseInt(n, 16)) : ("%" + n).toUpperCase();
  }).join("");
  Logger.log(res)
}
结果:

在日志中可以看到如下结果

%96%7B%93%FA%82%CD%90%B0%93V%82%C8%82%E8
  • 本日は晴天なり用示例脚本1转换后,就变成了%96%7B%93%FA%82%CD%90%B0%93%56%82%C8%82%E8。这也可以解码。不过好像一般都是用示例脚本2转换后的结果值

流量:

这个脚本的流程如下。

  1. 创建新的 blob 作为空数据。
  2. あいう 的文本值放入 blob。那时,文本值被放置为字符集的Shift-JIS
    • 在这种情况下,即使使用blob.getDataAsString("Shift_JIS"),结果也会变成UTF-8。所以需要将blob作为二进制数据使用,不转换为字符串数据。这是这个答案的重点。
  3. 将 blob 转换为字节数组。
  4. 将有符号十六进制的字节数组转换为无符号十六进制。
    • 在Google Apps 脚本中,字节数组被用作十六进制签名。所以需要转换成无符号十六进制。
    • 当值为KANJI字符时,当2个字节的字符可以转换为ascii码的字符串值时,需要使用字符串值。 "Sample script 2" 的脚本可以用于这种情况。
      • 在上面的示例中, 变为 %93V
  5. %添加到每个字节的顶部字符。

参考文献:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。