如何在 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转换后的结果值
流量:
这个脚本的流程如下。
- 创建新的 blob 作为空数据。
- 将
あいう
的文本值放入 blob。那时,文本值被放置为字符集的Shift-JIS
。
- 在这种情况下,即使使用
blob.getDataAsString("Shift_JIS")
,结果也会变成UTF-8
。所以需要将blob作为二进制数据使用,不转换为字符串数据。这是这个答案的重点。
- 将 blob 转换为字节数组。
- 将有符号十六进制的字节数组转换为无符号十六进制。
- 在Google Apps 脚本中,字节数组被用作十六进制签名。所以需要转换成无符号十六进制。
- 当值为KANJI字符时,当2个字节的字符可以转换为ascii码的字符串值时,需要使用字符串值。 "Sample script 2" 的脚本可以用于这种情况。
- 在上面的示例中,
天
变为 %93V
。
- 将
%
添加到每个字节的顶部字符。
参考文献:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
我是 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转换后的结果值
流量:
这个脚本的流程如下。
- 创建新的 blob 作为空数据。
- 将
あいう
的文本值放入 blob。那时,文本值被放置为字符集的Shift-JIS
。- 在这种情况下,即使使用
blob.getDataAsString("Shift_JIS")
,结果也会变成UTF-8
。所以需要将blob作为二进制数据使用,不转换为字符串数据。这是这个答案的重点。
- 在这种情况下,即使使用
- 将 blob 转换为字节数组。
- 将有符号十六进制的字节数组转换为无符号十六进制。
- 在Google Apps 脚本中,字节数组被用作十六进制签名。所以需要转换成无符号十六进制。
- 当值为KANJI字符时,当2个字节的字符可以转换为ascii码的字符串值时,需要使用字符串值。 "Sample script 2" 的脚本可以用于这种情况。
- 在上面的示例中,
天
变为%93V
。
- 在上面的示例中,
- 将
%
添加到每个字节的顶部字符。
参考文献:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。