Console.Write 大约写2G字符后就会抛出
"Must complete Convert() operation or call Encoder.Reset() before calling GetBytes() or GetByteCount(). Encoder 'Chinese Simplified (GB2312)' fallback 'System.Text.InternalEncoderBestFitFallback'."
中文描述
" System.ArgumentException: 必须首先完成 Convert() 操作或调用 Encoder.Reset(),然后才能调用 GetBytes() 或 GetByteCount()。编码器" 简体中文(GB2312)"回退" System.Text.InternalEncoderBestFitFallback"。"
从堆栈上来是System.Text.DBCSCodePageEncoding.GetBytes函数执行出错!
所以这个bug并不仅仅影响Console.Write,对于写文本文件(StreamWriter)同样会出现!
在网上搜索了一下,似乎亚洲字符都有这个问题,Big5 日文JIS都存在相关的提问,用vs2005和vs2008测试了一下,都存在这个问题.
解决方案:
控制台:使用WriteConsole这个Windows API
文件:当写入的数据大小接近2G时,关闭文件,以追加打开继续写!
控制台的解决源代码:
public static class ConsoleEx { public static IntPtr OutHandle { get { if (outHandle == IntPtr.Zero) outHandle = GetStdHandle(StdHandle.STD_OUTPUT_HANDLE); return outHandle; } } public static void Write(string value) { if (outHandle == IntPtr.Zero) return; int numberOfCharsWritten; char[] valueArray = value.ToCharArray(); WriteConsole(outHandle, valueArray, valueArray.Length, out numberOfCharsWritten, 0); } public static void Write(string format, params Object[] arg) { Write(string.Format(format, arg)); } public static void WriteLine(string value) { Write(value); Write(Environment.NewLine); } public static void WriteLine(string format, params Object[] arg) { Write(format, arg); Write(Environment.NewLine); } enum StdHandle { STD_INPUT_HANDLE = -10, STD_OUTPUT_HANDLE = -11, STD_ERROR_HANDLE = -12 } [System.Runtime.InteropServices.DllImport("Kernel32.dll")] static extern IntPtr GetStdHandle(StdHandle nStdHandle); [System.Runtime.InteropServices.DllImport("Kernel32.dll")] static extern int WriteConsole( IntPtr hConsoleOutput, char[] lpBuffer, int nNumberOfCharsToWrite, out int lpNumberOfCharsWritten, int lpReserved); static IntPtr outHandle = IntPtr.Zero; }
Copyright(c) Beingstudio
Author:Chenshicai
QQ:550084
Email or MSN or Gtalk:beingstudio@gmail.com
Blog:http://blog.886s.com/

