载入中,请稍候……

通过查询文本文件流前导符判断文本编码[C#]

Admin 于 2008-09-29 02:13:36 发表.NET

  1. /// <summary> 
  2. /// 取得一个文本文件流的编码方式。 
  3. /// </summary> 
  4. /// <param name="stream">文本文件流。</param> 
  5. /// <param name="defaultEncoding">默认编码方式。 
  6. /// 当该方法无法从文件的头部取得有效的前导符时,将返回该编码方式。 
  7. /// </param> 
  8. /// <returns></returns> 
  9. public static Encoding GetEncoding(FileStream stream, Encoding defaultEncoding) 
  10.     Encoding targetEncoding = defaultEncoding; 
  11.     if(stream != null && stream.Length >= 2) 
  12.     { 
  13.         //保存文件流的前4个字节 
  14.         byte byte1 = 0; 
  15.         byte byte2 = 0; 
  16.         byte byte3 = 0; 
  17.         byte byte4 = 0; 
  18.         //保存当前Seek位置 
  19.         long origPos = stream.Seek(0, SeekOrigin.Begin); 
  20.         stream.Seek(0, SeekOrigin.Begin); 
  21.         
  22.         int nByte = stream.ReadByte(); 
  23.         byte1 = Convert.ToByte(nByte); 
  24.         byte2 = Convert.ToByte(stream.ReadByte()); 
  25.         if(stream.Length >= 3) 
  26.         { 
  27.             byte3 = Convert.ToByte(stream.ReadByte()); 
  28.         } 
  29.         if(stream.Length >= 4) 
  30.         { 
  31.             byte4 = Convert.ToByte(stream.ReadByte()); 
  32.         } 
  33.         //根据文件流的前4个字节判断Encoding 
  34.         //Unicode {0xFF, 0xFE}; 
  35.         //BE-Unicode {0xFE, 0xFF}; 
  36.         //UTF8 = {0xEF, 0xBB, 0xBF}; 
  37.         if(byte1 == 0xFE && byte2 == 0xFF)//UnicodeBe 
  38.         { 
  39.             targetEncoding = Encoding.BigEndianUnicode; 
  40.         } 
  41.         if(byte1 == 0xFF && byte2 == 0xFE && byte3 != 0xFF)//Unicode 
  42.         { 
  43.             targetEncoding = Encoding.Unicode; 
  44.         } 
  45.         if(byte1 == 0xEF && byte2 == 0xBB && byte3 == 0xBF)//UTF8 
  46.         { 
  47.             targetEncoding = Encoding.UTF8; 
  48.         } 
  49.         //恢复Seek位置       
  50.         stream.Seek(origPos, SeekOrigin.Begin); 
  51.     } 
  52.     return targetEncoding; 
被阅1070次, 1票编码 发表评论

程序员创业失败的16个原因

Admin 于 2008-09-25 01:31:48 发表杂谈

1)   没有明确的生活目标。没有奋斗的中心目标或明确的努力主向,就没有成功的希望。

2)   没有非同寻常的雄心抱负。

如果对凡事漠不关心,不想在人生中求发展,不愿付出代价,那么这样的人也将成功无望。

3)   缺乏自律。

纪律来自自我控制,这意味着人必须控制所有的消极思想,只能先控制自己,才能控制环境。自制是人类面对的最艰巨任务,如果无法战胜自我,就会被自我征服。

4)   拖拉。

这是失败最普遍的原因之一,拖拉“老人”存在于每个人心中的阴暗角落,正是因为一直都在等待“适当时机”,才开始做那些值得做的事情,其实时机永远不会“适当”。

5)   缺乏毅力。

不管做什么,大部份人开始时都满怀信心,但却不能善始善终。大部份人一遇到失败就容易放弃。毅力是不可取代的。把毅力当座右铭奉行到底的人,发现失败会自行退下,失败是无法对抗毅力的。

6)   消极的个性。

因为消极的个性,而将别人拒于千里之外者,不会有成功的希望。成功来自力量的运用,而力量又来自与他人的合作,消极的个性无法促成合作。

7)   无法克制“不劳而获”的欲望。这种机体本能使很多人走向失败。

8)   缺乏果断的决策力。

成功的人士会果断决策,然后如果有必要,再慢慢改进。失败者往往花很长时间才能作出决策,但很快就需要修改,而且要频繁修改。犹豫和拖拉是一对双包胎,只要找到其中一个就一定能找到另一个,所以必须趁它们没有将你完全束缚在失败的车轮上,果断地把它们消灭。

9)   过度谨慎。

不主动抓住机会的人往往只能捡别人挑剩的机会,过度谨慎和不够谨慎都不可取,人生本来就充满偶然成分。

10)   迷信与偏见。

迷信是恐惧的一种形式,也是无知的表现,成功人士心胸宽广,无所畏惧。

11)   目标不专。“万事通,万事松”,要全心全意专注于一个主要目标。

12)   缺乏热情。

没有热情,一个人就没有说服力,而且热情有一种感染力,一个人如果拥有热情,并能适当控制热情,往往会受到人们的欢迎。

13)   偏执。心胸狭窄很难取得任何进步,偏执说明一个人不积极获取知识。

14)   蓄意不忠。

诚实是一种不可替代的品质,受无法控制的环境所迫,一个人可能一时不忠诚,也不会带来永久的破坏。但是,如果一个人蓄意不忠,则无药可救。他的得行为迟早会被发现,他负出的代价可能是失去信誉,甚至失去自由。

15)   自私和虚荣。这些品质问题好比亮起红灯,让人不敢靠近,是妨碍成功的致命因素。

16)   猜测而不思考。

多数人往往漫不经心或者过于懒惰,不愿费心获取用于准确思考的事实。他们喜欢根据猜测或仓促得出的“结论”了事。观念改变人生!选择决定未来!行动决定成败!
 

被阅506次, 0票程序员 发表评论

有助于你编程而立即要做的10件事

Admin 于 2008-09-25 01:31:10 发表杂谈

1.升级单元测试

你的编程没有测试?你应当随时进行测试,即TATFT ( testing all the fucking time )。当然你应当选择比仅是单元测试更好的方式。RSpec和Shoulda是两个可以选来使用的工具。

2.试用TDD

既然你在测试,那你就应当记录下这些测试。不要记录代码并用后来的测试覆盖它,而应当是方法的记录。TDD ( Test Drive Development ) 可以使你编出更好的代码,TATFT最重要的基础就是 TDD。进行TATFT并不难,首先你写下你所能做的最简单的测试并运行,观察测试的失败,然后写出执行语句以便使测试通过,不停地重复这样的过程就可以了。

3.自动化部署

自动化是你最好的朋友,想要实现自动Capistrano是相当好用的工具。在你配置部署好你的项目后,第一个要装的东西就应当是Capistrano。从第一天起就可以自动化部署将会节约你大量的时间。

4.安装 SCM

安装 SCM并学习使用它,这样做的好处是可以使那些超重的库中的代码不再那么冗繁,目前有大量的工具可以选择,我每天使用的是Git。Git是一款很特别的分布式SCM,即DSCM。DSCM是很有前景的,它可以同有其他库的用户们协同工作。

5.审查持续集成

现在我们已经测试了代码并将其安全的存放在库内。比起不停地测试,什么是更好的方式?自动测试是个不错的选择。很感激有cruisecontrol.rb的存在,这个应用工具自动运行了那些琐碎的测试。

6.了解你的代码

写代码是一回事,但是更重要的事情是了解代码。可以用四种自动化工具来帮助你了解代码:flog、 tarantula、rcov 和saikuro。这些工具分别有其独到之处,我很乐意向你介绍它们。
Flog,可以按字母排列的顺序来记录复杂的结果。

Tarantula,根据相关性原则和一些灵活的创意设计的。它所做的是spider 你的Rail应用以便去搜索坏链接。这真是令人得到解脱,使我受益匪浅。

Rcov,这是一个在Ruby界相当受欢迎的工具。它是一个C0范围工具,换言之,它精确的测定出你的代码中哪些部分在被测试,哪些部分没被测试。唯一的缺陷是它不能测试诸如:“if condition_a && condition_b || condition_c”. 这样的语句。

Saikuro,可以测量出你代码环的复杂性,即可以计算出你代码branche 和path的数量。当然你代码的复杂性越低,它运行的越容易。

7.升级你的Fixtures

Fixtures 是看起来很有创意的事物之一,但有诸多的弊端。对于Fixtures,只有极少的替代,我选择使用Rails Scenarios,原因是它在测试中工作起来像Fixtures一样,但是允许我做比YAML更好的DSL。我也可以在一个文件内指定多重的 Scenarios,这将使事情变得更有组织性。

8.收集分析对象

在Rail平台上搭建新的系统。每周都会有新的监控工具出现,这样我们有很多的选择,在这里我介绍我已经使用过的工具:HopToad 和 TuneUp。

HopToad对于异常报文有不错的能力,它可收集间断应用并用简便的方式显示收集结果。还有,这是一个免费软件~

TuneUp用另外一种方式获取数据,它计算每一处分别花费多长时间去组合自身。你的页面是不是花费了很长时间去组建?但你又不知道是因为什么缘故花费了这么久,使用TuneUp来查一下吧,你会发现一些你以前从未想到过的事情。另外,TuneUp是一款开源软件,你可以登陆进他们的托管服务分享你的结果。

9.阅读其他人的代码

你想成为更优秀的程序员吗?那一定要多读代码,这包括好的、坏的、你自己的、其他人的代码等。阅读代码是一项很多程序员都不重视的技能,但其实能够快速阅读他人的代码并理解其中的含义是一种极其需要的能力。

10.写博客的习惯

就我个人来说,当我阅读博客的时候我可以找到所有的信息。大部分时候我是会撰写跟技术相关的要点,偶尔讨论点轻松的话题。写博客是出于分享的原因,你可以写下能够帮你节约时间的技术技巧,也可以是一些你想要记住的技术难点和命令之类。

被阅422次, 0票 发表评论

C# 监控U盘插入与拔出

Admin 于 2008-09-24 13:31:10 发表.NET

  1. using System; 
  2. using System.Collections.Generic; 
  3. using System.ComponentModel; 
  4. using System.Data; 
  5. using System.Drawing; 
  6. using System.Text; 
  7. using System.Windows.Forms; 
  8. using System.Runtime.InteropServices; 
  9.  
  10. namespace upan 
  11.     public partial class Form1 : Form 
  12.     { 
  13.         public Form1() 
  14.         { 
  15.             InitializeComponent(); 
  16.         } 
  17.         public Message mm; 
  18.         protected override void WndProc(ref Message m) //监视Windows消息 
  19.         { 
  20.             const int WM_DEVICECHANGE = 0x219; 
  21.             const int WM_DEVICEARRVIAL = 0x8000;//如果m.Msg的值为0x8000那么表示有U盘插入 
  22.             const int WM_DEVICEMOVECOMPLETE = 0x8004; 
  23.             switch (m.Msg) 
  24.             { 
  25.                 case WM_DEVICECHANGE: 
  26.                     { 
  27.                         ShowDeviceChanged("WM_DEVICECHANGE"); 
  28.                         if (m.WParam.ToInt32() == WM_DEVICEARRVIAL) 
  29.                             ShowDeviceChanged("WM_DEVICEARRVIAL"); 
  30.                         else if (m.WParam.ToInt32() == WM_DEVICEMOVECOMPLETE) 
  31.                             ShowDeviceChanged("WM_DEVICEMOVECOMPLETE"); 
  32.                     } 
  33.                     break
  34.             } 
  35.             base.WndProc(ref m); //将系统消息传递自父类的WndProc 
  36.  
  37.         } 
  38.         public void ShowDeviceChanged(string message) 
  39.         { 
  40.             switch (message) 
  41.             { 
  42.                 case "WM_DEVICECHANGE"
  43.                     this.textBox_Message.Text += "Device Changed \r\n"
  44.                     break
  45.                 case "WM_DEVICEMOVECOMPLETE"
  46.                     this.textBox_Message.Text += "Device Moved\r\n"
  47.                     break
  48.                 case "WM_DEVICEARRVIAL"
  49.                     this.textBox_Message.Text += "Device Arrived\r\n"
  50.                     break
  51.             } 
  52.         } 
  53.  
  54.         private void Form1_Load(object sender, EventArgs e) 
  55.         { 
  56.             WndProc(ref mm); 
  57.         } 
  58.     } 
被阅983次, 0票U盘 发表评论

JavaScript中String对象的substr方法与substring方法的区别

Admin 于 2008-09-23 07:16:16 发表JavaScript

String.substr(N1,N2) 这个就是我们常用的从指定的位置(N1)截取指定长度(N2)的字符串;
String.substring(N1,N2) 这个就有点特别了,它是先从N1,N2里找出一个较小的值,然后从字符串的开始位置算起,截取较小值位置和较大值位置之间的字符串,截取出来的字符串的长度为较大值与较小值之间的差。

String.substring(N1,N2) 这个就是我们常用的从指定的位置(N1)到指定的位置(N2)的字符串;

被阅1031次, 0票 发表评论

硬盘接口总结

Admin 于 2008-09-23 07:04:02 发表硬件

硬盘的接口非常多,PC机使用的IDE、ATA、Ultra-ATA、SATA等等,还有SCSI的、SAS的,这些接口之间的关系往往显得错综复杂,难以琢磨,本文试图把它们的来龙去脉、派生渊源分析清楚,以便记忆。

被阅727次, 0票 发表评论

C++位操作介绍

Admin 于 2008-09-23 07:02:26 发表C/C++

C++位操作包括两种:传统的C语言方式的位操作和C++中利用bitset容器的位操作

   
一、传统的C方式位操作:
1.基本操作:
   使用一个unsigned int变量来作为位容器。
2.操作符:
|   按位或操作符:result=exp1|exp2;当exp1和exp2中对应位中至少有一个为1时,result中对应位为1,否则为0。
&  按位与操作符::result=exp1&exp2;当exp1和exp2中对应位全为1时,result中对应位为1,否则为0。
^  按位异或或操作符:result=exp1^exp2;当exp1和exp2中对应位不相同时,result中对应位为1,否则为0。
~  反转操作符:将位容器中的所有位都反转,1变为0,0变为1。
<< 按位左移操作符:exp<<n,将容器中所有的位向左移n位,空出的位用0填充。
>> 按位右移操作符:exp>>n,将容器中所有的位向右移n位,空出的位用0填充。
|=,&=,^= 分别对应|&^三种操作符的复合操作符。
3.常用操作
   这里我们假设有一个result的unsigned int变量用来储存32个学生的成绩(通过和不通过分别用0和1),这样result就有33位(result从右至左,从0开始计算位数,在这个例子中0位被浪费)。
(a) 将第27位设置为及格(设作1)其他位不变:
   result|=(1<<27) //任意的位值与1作按位或操作其值为1,而与0作按位与操作其值不变
(b) 将第27位设置成不及格(设为0)。
   result&=~(1<<27) //任意的位值与0作按位与操作其值为0,而与1作按位与操作其值不变
(c) 反转第27位的值。
   result^=(1<<27) //任意的位值与1作按位异或操作其值为1,而与0作按位异与操作其值不变
 
二、C++中的bitset容器
1.头文件:
  #include <bitset>
2.声明一个容器:
 (a)声明一个指定位数的空容器(所有位设为0): bitset<int> bits;
 (b)声明一个指定位数并将指定的几个位初始化为相应值的容器: bitset<n> bits(int);
     bitdet<int> bits(string&)
总结:bitset模板类中类型参数传递容器的位数,而构造函数参数通过一个int或一个string&值来从右至左初始化容器中的相应值。
3.bitset的基本用法:
4.bitset与传统C位操作及字符串的转换
   可以通过to_string()成员将容器转输出为一个string字符串,另外还可以用to_long()成员将容器输出到传统的用于C风格的位容器中。如:
  unsigned long bits = bits.to_long();
  sting str(bits.to_string());
5.bitset支持所有的位操作符。

 

被阅473次, 1票 发表评论

预览将上传的本地图片

Admin 于 2008-09-23 06:58:03 发表JavaScript

在项目中,有上传本地图片先预览的功能。原先在本机IE6,IE7浏览器中可正常预览的功能,但在将项目布暑到远程服务器的时候,在IE7中不能预览了。此问题,在之前同事的IE7访问我机子预览时也出现过,当时没在意,认为系统不会有问题。

今天,上网找了许久,终于知道了,这原来是IE7中加强了安全限制。通过http访问的页面默认是没有访问用户本机图片文件的权限的,所以通过 javascript获取不了本机的图片路径等相关信息。网上也有几种解决方案,一种是通过利用style 的"DXImageTransform.Microsoft.AlphaImageLoader" 滤镜来实现,而另一种,则是设置当前站点为安全站点即可。

由于,预览还涉及到图片旋转等,利用"DXImageTransform.Microsoft.AlphaImageLoader"方式,确不知道该如何旋转此滤镜中的图片,故暂时决定采用设置安全性方式,有劳用户了。

一些莫名其妙的错误都是有源头的。

收集的资料贴出来:

被阅538次, 0票 发表评论
5 / 11 / 87 | « 2 3 4 5 6 7 8 » |

Powered by MiniBoke v2.0.0.8 Build 0828

Copyright © 2008 迷你博客. All rights reserved.

粤ICP备07500939号