HTTPS POST в кодировке shift-jis

Я пытаюсь отправить запрос POST на сервер, который декодирует с помощью SHIFT-JIS. Эта строка サービス переводится в 繧オ繝シ繝薙せ после декодирования с помощью SHIFT-JIS. Похоже, что запрос всегда будет кодироваться в UTF-8 всякий раз, когда запрос отправляется. Я использую nodejs для отправки запроса. Вопрос в том, как мне отправить символы в кодировке shift-jis? Это казалось простым, но я просто не мог понять, как это сделать.

Прослушивающий сервер

var iconv = require('iconv-lite');
const http = require('http');

http.createServer((request, response) =>
{
    const
    {
        headers,
        method,
        url
    } = request;
    let body = [];
    request.on('error', (err) =>
    {
        console.error(err);
    }
    ).on('data', (chunk) =>
    {
        body.push(chunk);
    }
    ).on('end', () =>
    {
        body = Buffer.concat(body).toString();
        // BEGINNING OF NEW STUFF
        body = iconv.decode(Buffer.from(body), 'shift_jis');
        response.on('error', (err) =>
        {
            console.error(err);
        }
        );

        response.statusCode = 200;
        response.setHeader('Content-Type', 'application/json');
        // Note: the 2 lines above could be replaced with this next one:
        // response.writeHead(200, {'Content-Type': 'application/json'})

        const responseBody =
        {
            headers,
            method,
            url,
            body
        };

        response.write(JSON.stringify(responseBody));
        console.log(body);
        console.log(responseBody);
        response.end();
        // Note: the 2 lines above could be replaced with this next one:
        // response.end(JSON.stringify(responseBody))

        // END OF NEW STUFF
    }
    );
}
).listen(8000);

Запрос

var request = require('request');

request({
    url: 'http://localhost:8000',
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=shift_jis' },
    method: 'POST',
    body: 'サービス'
}, function(error, response, body){
    if(error) {
        console.log(error);
    } else {
        console.log(response.statusCode, body);
    }
});

РЕДАКТИРОВАТЬ: Оказывается, модуль axios, который мы используем для HTTPS POST, будет кодировать полезную нагрузку в UTF-8 перед отправкой запроса. Мы клонировали модуль axios и модифицировали его для кодирования в SHIFT-JIS.


person GT Foo    schedule 02.12.2020    source источник
comment
Вопиющее дело mojibake. Доказательство (код Python не требует пояснений, ИМХО): '繧オ繝シ繝薙せ' выводится из 'サービス'.encode('utf-8').decode('shift-jis')  -  person JosefZ    schedule 02.12.2020
comment
Похоже, вы не предпринимаете никаких конкретных попыток отправить данные как Shift-JIS. Простого объявления charset=shift_jis в заголовках этого не произойдет. Используйте iconv, чтобы фактически преобразовать строку в Shift-JIS.   -  person deceze♦    schedule 02.12.2020
comment
вар текст = サービス; const iconv2 = новый Iconv (UTF-8, SHIFT_JIS); const textBuffer = iconv2.convert(text).toString(); Я пробовал вышеописанное, но вместо этого получаю 郢ァ�スオ郢晢スシ郢晁侭縺�   -  person GT Foo    schedule 02.12.2020
comment
Если вы снова неправильно попытаетесь интерпретировать эту строку в кодировке Shift-JIS как текст UTF-*, да, вы получите тарабарщину. Я не слишком разбираюсь в iconv в узле, но iconv в основном должен возвращать вам ArrayBuffer или что-то подобное, которое вы передаете как есть request для отправки необработанных двоичных данных (представляющих текст в кодировке Shift-JIS).   -  person deceze♦    schedule 02.12.2020


Ответы (1)


Если вы хотите отправить строку с кодировкой Shift-JIS, вам необходимо преобразовать целевую строку (внутренне представленную в UTF-16) в Shift-JIS, прежде чем добавлять ее в тело запроса.

Стандартный TextEncoder поддерживает только кодировку UTF-8 и не может обрабатывать Shift- Кодировка JIS. Поэтому вам нужно использовать дополнительные модули, такие как encoding.js или text-encoding для этой цели.

person SATO Yusuke    schedule 09.12.2020