我需要从 UTF-8 字节序列中读取一个字符串。这些字节的来源来自单独的读取操作,这些操作不考虑字符边界,因此我无法使用 System.Text.Encoding.UTF8.GetString。但是,由 System.Text.Encoding.UTF8.GetDecoder() 返回的 System.Text.Decoder 类似乎是为这种情况设计的。 OUT 参数之一看起来应该指示字符何时仅被部分读取。
Convert 的文档(位于https://msdn.microsoft.com/en-us/library/h6w985hz(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/h6w985hz(v=vs.110).aspx) 表明,如果输出 ( char[] ) 缓冲区太小,或者并非所有字节都可以转换,则完成的值应该为 false。参见备注第 4 段。
但是,当字符的字节尚未完全转换时,即使文档说它应该为 false,完成的值也似乎为 TRUE。
我认为我做错了什么(或者这是一个错误??),如果是这样,我如何检测我的字节流是否在字符中间暂停?
演示代码:
const int outSize = 10;
char[] outBuf = new char[outSize];
byte[] frag1 = new byte[] { 0xE7 };
byte[] frag2 = new byte[] { 0x95, 0xA2 };
var decoder = System.Text.Encoding.UTF8.GetDecoder();
int bytesUsed, charsUsed; bool completed;
// the first byte of the UTF-8 character
decoder.Convert(frag1, 0, frag1.Length, outBuf, 0, outSize, false, out bytesUsed, out charsUsed, out completed);
Debug.Assert( bytesUsed == 1 );
Debug.Assert( charsUsed == 0 );
// // // // // // // // // // // // completed is true here, but WHY ?
Debug.Assert( ! completed);
// // // // // // // // // // // //
// the second and third bytes of the UTF-8 character
decoder.Convert(frag2, 0, frag2.Length, outBuf, 0, outSize, false, out bytesUsed, out charsUsed, out completed);
Debug.Assert(bytesUsed == 2);
Debug.Assert(charsUsed == 1);
Debug.Assert(completed);
Debug.Assert( new String(outBuf, 0, 1 ) == "畢" );
Thanks!