스트리밍 버퍼를 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')
텍스트 청크의 끝 / 시작에서 잘못된 문자가 생성됩니다. 어떻게 피할 수 있습니까?
힌트 : 다운로드 한 바이트 수를 제한하려면 여전히 버퍼 (특히 버퍼의 바이트 수)가 필요합니다. 따라서 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
'Programing' 카테고리의 다른 글
Redux 애플리케이션에서 코드 분할을 위해 리듀서를 동적으로로드하는 방법은 무엇입니까? (0) | 2020.05.25 |
---|---|
Dapper로 삽입 및 업데이트 수행 (0) | 2020.05.25 |
인라인 기능 사용시기와 사용하지 않을시기 (0) | 2020.05.25 |
버전 제어를 위해 어떤 Visual C ++ 파일 형식을 커밋해야합니까? (0) | 2020.05.25 |
동기화 및 잠금 (0) | 2020.05.25 |