[解決済み】ストリームバッファをutf8-stringに変換する。
質問
私はウェブサーバーからいくつかのテキストを読み込むためにnode.jsを使用してHTTP-requestを作成したいと思います。応答は多くのテキスト(数メガバイト)を含むことができるので、私は各テキストチャンクを別々に処理したいと思います。私はこれを次のコードで達成することができます。
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
) で、2 バイト目が 2 番目のチャンクであれば
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
(チャンク)に、2バイト目を2番目の
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
});
});
このようにバイトの
未完成
の文字がバッファリングされます。
StringDecoder
必要なバイトがすべてデコーダに書き込まれるまで。
関連
-
[解決済み】mongoError: トポロジーが破壊されました
-
[解決済み】「npm install」と「npm rebuild」の違いとは?
-
[解決済み] create-react-app、インストールエラー("コマンドが見つからない")。
-
[解決済み] Passport JSのreq.isAuthenticated()はどのように実装されていますか?[クローズド]
-
[解決済み] nvm は npm config の "prefix" オプションと互換性がありません。
-
[解決済み] エラーです。Expressでビューの検索に失敗しました
-
[解決済み] npm not able to find a fileに関連するエラーは何が原因でしょうか?node_modules サブフォルダ内にコンテンツがありません。なぜでしょうか?
-
[解決済み] Node.js上のExpress.jsでGET(クエリ文字列)変数を取得する方法とは?
-
[解決済み] 既存のコールバックAPIをプロミスに変換するにはどうすればよいですか?
-
[解決済み] 配列からオブジェクトへの変換
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] リソースの読み込みに失敗しました: net::ERR_CONNECTION_REFUSED : Nodejs
-
[解決済み】 console.logの出力をどこに永久保存するか?
-
[解決済み】Node.jsのホスト名/IPが証明書のaltnamesと一致しない。
-
[解決済み】nodemon - app crashed - waiting for file changes before start
-
[解決済み] nodejs - http.requestでresponse.writeを使用する場合、第一引数は文字列またはBufferでなければなりません。
-
[解決済み] Npmエラー - Windows NT - 解決方法
-
[解決済み] Macでポート3000をロックしているプロセスを見つける(そして殺す)【終了
-
[解決済み] "app.use(express.cookieSession())" に "secret" オプションが必要です。
-
[解決済み] "致命的なエラーです。grunt "コマンドを実行すると、"Unable to find local grunt. "と表示されます。
-
[解決済み] Node.jsのストリームの内容を文字列変数に読み込むにはどうしたらいいですか?