3

ループでは、UTF-8 としてエンコードされたストリームを読み取っています。ループごとに 10 バイト (たとえば) です。ストリームは最初にバッファーに渡されるため、UTF-8 文字列に変換する前に、読み取り長をバイト単位で指定する必要があります。私が直面している問題は、部分的で不完全な文字を読み取ることがあるということです。これを修正する必要があります。

文字列が不完全な文字で終わっているかどうかを検出する方法はありますか、またはこれを判断するために文字列の最後の文字に対して実行できるチェックはありますか?

できれば、「非シングル エンコーディング」ソリューションが最適です。

4

1 に答える 1

0

バッファーが不完全な文字で終了し、それを文字列に変換してから、その文字列から新しいバッファーを初期化すると、新しいバッファーは異なる長さになります (utf8 を使用している場合は長く、ucs2 を使用している場合は短くなります)。オリジナルより。

何かのようなもの:

var b1=new Buffer(buf.toString('utf8'), 'utf8');
if (b2.length !== buf.length) {
   // buffer has an incomplete character
} else {
   // buffer is OK
}

「utf8」を目的のエンコーディングに置き換えます。

これは、文書化されていない不完全な文字の現在の実装の処理方法に依存していることに注意してくださいBuffer#toString。ただし、同じ長さのバッファーになるような方法で変更される可能性は低いです (将来の実装では、代わりにエラーがスローされる可能性があるため、おそらくコードを try-catch ブロックでラップする必要があります)。

于 2012-08-17T20:23:00.900 に答える