识别文本文件编码

做个了文件分割软件,但是在分割文本小说时,发现分割出来的子文件并没有使用源文件的编码,

却是使用的UTF-8,在editplus中看倒是也没有什么,但是在MOBIPORKET READER中打开却是乱码,

因此,决定找到问题,修改一下,经过搜索和查看MSDN,

总结如下,

使用

 

ContractedBlock.gif ExpandedBlockStart.gif Code
public StreamReader (
    
string path,
    
bool detectEncodingFromByteOrderMarks
)

构造函数使用StreamReader就可以了,这样在StreamReader的实例中属性CurrentEncoding就包含了,文件的原始编码信息

 

扩展一下:

搜索的时候发现文本文件的开头几个字节就可以用来文件使用的编码情况,在C#中使用下面:

 

ContractedBlock.gif ExpandedBlockStart.gif Code
 1    public class GetPreamble
 2ExpandedBlockStart.gifContractedBlock.gif    {
 3        public Dictionary<stringstring> GetPreambles(bool hasPreamble)
 4ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 5            Dictionary<stringstring> result = new Dictionary<stringstring>();
 6            EncodingInfo[] encs = Encoding.GetEncodings();
 7            foreach (EncodingInfo ei in encs)
 8ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 9                Encoding var = Encoding.GetEncoding(ei.CodePage);
10                byte[] preamble = var.GetPreamble();//得到文件的开头几个能表示编码情况的字节
11                StringBuilder sb = new StringBuilder();
12
13                if (hasPreamble)
14ExpandedSubBlockStart.gifContractedSubBlock.gif                {
15                    if (preamble.Length == 0)
16ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
17                        continue;
18                    }

19                }

20                foreach (byte bt in preamble)
21ExpandedSubBlockStart.gifContractedSubBlock.gif                {
22                    sb.AppendFormat("{0:X2} ", bt);
23                }

24                result.Add(ei.Name + "" + ei.CodePage + " )", sb.ToString());
25
26                sb.Remove(0, sb.Length);
27            }

28            return result;
29        }

30
31    }

 

utf-16( 1200 )FF FE
unicodeFFFE( 1201 )FE FF
utf-32( 12000 )FF FE 00 00
utf-32BE( 12001 )00 00 FE FF
utf-8( 65001 )EF BB BF

得到的记过如上表,很多的编码没有对应的Preamble字节数组...

转载于:https://www.cnblogs.com/josephshi/archive/2009/03/04/1402957.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值