programing

스트리밍 버퍼를 utf8-string으로 변환

powerit 2023. 10. 20. 14:53
반응형

스트리밍 버퍼를 utf8-string으로 변환

웹 서버에서 텍스트를 로드하기 위해 node.js를 사용하여 HTTP 요청을 하고자 합니다.응답에 많은 텍스트(일부 메가바이트)가 포함될 수 있기 때문에 각각의 텍스트 청크를 따로 처리하고 싶습니다.다음 코드를 사용하여 이를 달성할 수 있습니다.

var req = http.request(reqOptions, function(res) {
    ...
    res.setEncoding('utf8');
    res.on('data', function(textChunk) {
        // process utf8 text chunk
    });
});

이것은 문제없이 작동하는 것 같습니다.하지만 HTTP 압축을 지원하고 싶어서 zlib을 사용합니다.

var zip = zlib.createUnzip();

// NO res.setEncoding('utf8') here since we need the raw bytes for zlib
res.on('data', function(chunk) {
    // do something like checking the number of bytes downloaded
    zip.write(chunk); // give the raw bytes to zlib, s.b.
});

zip.on('data', function(chunk) {
    // convert chunk to utf8 text:
    var textChunk = chunk.toString('utf8');

    // process utf8 text chunk
});

다음과 같은 멀티바이트 문자의 경우 문제가 될 수 있습니다.'\u00c4'2바이트로 구성됩니다.0xC3그리고.0x84. 첫번째 바이트가 첫번째 청크에 의해 커버되는 경우 (Buffer)와 두 번째 청크에 의해 두 번째 바이트가 생성됩니다.chunk.toString('utf8')텍스트 청크의 끝/beginning에 잘못된 문자가 생성됩니다.어떻게 하면 이걸 피할 수 있을까요?

힌트: 다운로드된 바이트 수를 제한하려면 버퍼(구체적으로 버퍼의 바이트 수)가 여전히 필요합니다.그래서 사용.res.setEncoding('utf8')위의 첫번째 예제 코드처럼 압축되지 않은 데이터는 제 요구에 맞지 않습니다.

싱글 버퍼

싱글인 경우Buffer이진 내용의 전부 또는 일부를 특정 인코딩을 사용하여 문자열로 변환하는 메서드를 사용할 수 있습니다.기본값은 다음과 같습니다.utf8매개 변수를 제공하지는 않지만 이 예제에서 명시적으로 인코딩을 설정했습니다.

var req = http.request(reqOptions, function(res) {
    ...

    res.on('data', function(chunk) {
        var textChunk = chunk.toString('utf8');
        // process utf8 text chunk
    });
});

스트리밍된 버퍼

위의 질문과 같이 멀티바이트의 첫번째 바이트를 스트리밍한 경우UTF8-문자는 첫번째 문자에 포함될 수 있습니다.Buffer(chunk) 및 두 번째 바이트(초)Buffer그런 다음 . : 를 사용해야 합니다.

var StringDecoder = require('string_decoder').StringDecoder;

var req = http.request(reqOptions, function(res) {
    ...
    var decoder = new StringDecoder('utf8');

    res.on('data', function(chunk) {
        var textChunk = decoder.write(chunk);
        // process utf8 text chunk
    });
});

이런 방식으로 불완전한 문자의 바이트가 버퍼링됩니다.StringDecoder필요한 모든 바이트가 디코더에 기록될 때까지.

var fs = require("fs");

function readFileLineByLine(filename, processline) {
    var stream = fs.createReadStream(filename);
    var s = "";
    stream.on("data", function(data) {
        s += data.toString('utf8');
        var lines = s.split("\n");
        for (var i = 0; i < lines.length - 1; i++)
            processline(lines[i]);
        s = lines[lines.length - 1];
    });

    stream.on("end",function() {
        var lines = s.split("\n");
        for (var i = 0; i < lines.length; i++)
            processline(lines[i]);
    });
}

var linenumber = 0;
readFileLineByLine(filename, function(line) {
    console.log(++linenumber + " -- " + line);
});

언급URL : https://stackoverflow.com/questions/12121775/convert-streamed-buffers-to-utf8-string

반응형