Programing

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

crosscheck 2020. 5. 25. 21:03
반응형

스트리밍 버퍼를 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 바이트로 구성되는 : 0xC30x84. 첫 번째 바이트가 첫 번째 청크 ( Buffer) 로 덮여 있고 두 번째 바이트가 두 번째 청크로 덮여 있으면 chunk.toString('utf8')텍스트 청크의 끝 / 시작에서 잘못된 문자가 생성됩니다. 어떻게 피할 수 있습니까?

힌트 : 다운로드 한 바이트 수를 제한하려면 여전히 버퍼 (특히 버퍼의 바이트 수)가 필요합니다. 따라서 res.setEncoding('utf8')압축되지 않은 데이터에 위의 첫 번째 예제 코드와 같이 사용 하는 것이 내 요구에 맞지 않습니다.


단일 버퍼

단일 Buffer이있는 경우 toString바이너리 인코딩의 일부 또는 전부를 특정 인코딩을 사용하여 문자열로 변환 하는 메소드를 사용할 수 있습니다 . utf8매개 변수를 제공하지 않으면 기본값 이지만이 예제에서는 인코딩을 명시 적으로 설정했습니다.

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

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

스트리밍 버퍼

멀티 바이트 UTF8문자 의 첫 번째 바이트가 첫 번째 Buffer(청크)에 포함되고 두 번째 바이트가 두 번째 바이트에 포함될 수있는 위의 질문과 같은 버퍼를 스트리밍했다면을 Buffer사용해야합니다 StringDecoder. :

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
    });
});

This way bytes of incomplete characters are buffered by the StringDecoder until all required bytes were written to the decoder.


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

반응형