스트리밍 버퍼를 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
'programing' 카테고리의 다른 글
필수 특성 각도 J의 파일 입력과 함께 작동하지 않습니다. (0) | 2023.10.20 |
---|---|
mysql의 다른 활동을 기반으로 행 가져오기 (0) | 2023.10.20 |
Android Service가 Activity와 통신하도록 하는 방법 (0) | 2023.10.20 |
Woocommerce에서 선택한 "일" 사용자 정의 필드를 기반으로 카트 항목 가격 계산 (0) | 2023.10.20 |
잘린 LISTAGG 문자열 (0) | 2023.10.20 |