Как сгенерировать процентную строку Shift_JIS (SJIS) в JavaScript - PullRequest
1 голос
/ 23 января 2020

Я новичок и в JavaScript, и в Google Apps Script, и у меня возникла проблема с преобразованием текстов, написанных в ячейке, в буквы, закодированные в Shift-JIS (SJIS). Например, японская строка «あ い う» должна быть закодирована как «% 82% A0% 82% A2% 82% A4», а не как «% E3% 81% 82% E3% 81% 84% E3% 81% 86», что в кодировке UTF-8.

Я пробовал кодирование JS и встроенную функцию urlencode (), но обе они возвращают кодировку UTF-8.

Кто-нибудь скажет мне, как правильно получать буквы в кодировке SJIS в GAS? Спасибо.

1 Ответ

2 голосов
/ 23 января 2020
  • Вы хотите, чтобы URL кодировался от あいう до %82%A0%82%A2%82%A4 как Shift-JIS набора символов.
    • %E3%81%82%E3%81%84%E3%81%86 - результат, преобразованный в UTF-8.
  • Вы хотите добиться этого с помощью скрипта Google Apps.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

Пункты этого ответа:

  • Чтобы использовать Shift-JIS набора символов в Сценарии Google Apps, это требуется использовать его в качестве двоичных данных. Потому что, когда в скрипте Google Apps извлекается значение Shift-JIS как строка, набор символов автоматически изменяется на UTF-8. Пожалуйста, будьте осторожны.

Пример сценария 1:

Чтобы преобразовать из あいう в %82%A0%82%A2%82%A4, как насчет следующего сценария? В этом случае этот сценарий можно использовать для символов HIRAGANA.

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. Таким образом, блоб необходимо использовать в качестве двоичных данных без преобразования в строковые данные. Это важный момент в этом ответе.
  3. Преобразование большого двоичного объекта в массив байтов.
  4. Преобразование массива байтов шестнадцатеричного числа со знаком в шестнадцатеричное число без знака.
    • В скрипте Google Apps используется байтовый массив с шестнадцатеричным знаком. Поэтому требуется преобразовать в шестнадцатеричное без знака.
    • Когда значение является символом KANJI, когда символы из 2 байтов могут быть преобразованы в строковое значение как код ascii, строковое значение должно быть используемый. Сценарий «Пример сценария 2» может быть использован для этой ситуации.
      • В приведенном выше примере становится %93V.
  5. Добавьте % к верхнему символу каждого байта.

Ссылки:

Если я неправильно понял ваш вопрос, и это не то направление, которое вы хотите, я извиняться.

...