This is a sample script for achieving the URL encode with Shift-JIS using Google Apps Script.
Unfortunately, there are no methods for directly achieving above in the methods of Google Apps Script. So it is required to prepare it as the script. In order to use Shift-JIS
of the character set at Google Apps Script, it is required to use it as the binary data. Because, when the value of Shift-JIS
is retrieved as the string by Google Apps Script, the character set is automatically changed to UTF-8
. Please be careful this.
Sample script
function urlEncodeBySJIS(str) {
var forAsciiConvert =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz*-.@_";
var conv = Utilities.newBlob(forAsciiConvert)
.getBytes()
.map(function(e) {
return ("0" + (e & 0xff).toString(16)).slice(-2);
});
var bytes = Utilities.newBlob("")
.setDataFromString(str, "Shift_JIS")
.getBytes();
return (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(""));
}
// Please run this function.
function main() {
var str = "本日は晴天なり";
var res = urlEncodeBySJIS(str);
Logger.log(res); // %96%7B%93%FA%82%CD%90%B0%93V%82%C8%82%E8
}
Result
You can see the following result at the log.
%96%7B%93%FA%82%CD%90%B0%93V%82%C8%82%E8
Flow
The flow of this script is as follows.
- Create new blob as the empty data.
- Put the text value of
本日は晴天なり
to the blob. At that time, the text value is put asShift-JIS
of the the character set.- In this case, even when
blob.getDataAsString("Shift_JIS")
is used, the result becomesUTF-8
. So the blob is required to be used as the binary data without converting to the string data. This is the important point in this answer.
- In this case, even when
- Convert the blob to the byte array.
- Convert the bytes array of the signed hexadecimal to the unsigned hexadecimal.
- At Google Apps Script, the byte array is uses as he signed hexadecimal. So it is required to convert to the unsigned hexadecimal.
- When the value is the KANJI character, when the characters of 2 bytes can be converted to the string value as the ascii code, the string value is required to be used. The script can be used for this situation.
- In the case of
本日は晴天なり
,天
becomes%93V
.
- Add
%
to the top character of each byte.
References
- newBlob(data)
- setDataFromString(string, charset)
- getBytes()
- map()
- How to generate a Shift_JIS(SJIS) percent encoded string in JavaScript
- This sample script was used for this thread.