源文件是UNICODE格式,用C#的Encoding.Convert转换成GB2312后,文件体积比直接用记事本打开另存为GB2312的多一个字节。打开用c#转换后的GB2312文件,比用记事本打开另存为的GB2312文件在文件的最前面多了一个“?”号。请问这是为什么呢?谢谢!

解决方案 »

  1.   

    /// <summary>
            /// 从一种编码到另一种编码
            /// </summary>
            /// <param name="str">源字符串</param>
            /// <param name="From">From</param>
            /// <param name="To">To</param>
            /// <returns></returns>
            string ConertStr(string str, string From, string To)
            {            byte[] bs = System.Text.Encoding.GetEncoding(From).GetBytes(str);
                bs = System.Text.Encoding.Convert(System.Text.Encoding.GetEncoding(From), System.Text.Encoding.GetEncoding(To), bs);
                string res = System.Text.Encoding.GetEncoding(To).GetString(bs);
                return res;        }=================================
    http://blog.csdn.net/hertcloud/
      

  2.   

    扩展名就一个Txt怎么判断?
    记事本是通过文件的首字节来判断文件格式的如果是Unicode则以0xFF,0xFE开头
    如果是Utf8则以0xEF,0xBB,0xBF开头
      

  3.   

    Unicode和Utf8的编码方式不同
    Unicode则以0xFF,0xFE开头
    Utf8则以0xEF,0xBB,0xBF开头
    结尾都是一样的,所以会多一个字节
      

  4.   

    我转换之前就已经确定是0XFFFE开头的UNICODE文件,而不是UTF8。同样进行转换,为什么多了一个字节呢。。
      

  5.   

    何必搞这么麻烦呢 Unicode编码不就好了 转gb干嘛
      

  6.   

    特殊需求,我当然也想用UNICODE的呵呵。
      

  7.   

    //如果是0xFF, 0xFE开头就跳到第3个位置开始读private byte[] Unicode2GB2312(byte[] UnicodeContentBytes)
    {
        int i = 0;
        if (UnicodeContentBytes.Length > 2 && UnicodeContentBytes[0] == 0xFF &&
            UnicodeContentBytes[1] == 0xFE) i = 2;
        return Encoding.Convert(Encoding.Unicode, 
            Encoding.GetEncoding("GB2312"), UnicodeContentBytes, i, 
            UnicodeContentBytes.Length - i);
    }
      

  8.   

    用GB2312码的芯片你伤不起  哎  我们也是用GB2312码标识汉字的