字符编码的使用和转换
字符编码主要分两种:MBCS以及 Unicode。 以 C/CC++ 为例,以 char 为单位的数组使用MBCS编码(如 ASCII,GB2312,BIG5),以wchar_t 为单位的数组使用Unicode作为编码。
比如你的程序中使用:
char szTitle[] = "窗体标题“;
此时,szTitle字符串使用的的是MBCS编码,如果用户的操作系统不是中文的Windows,你的程序将无法正常显示!
所以,要换成Unicode方式:
wchar_t szTitle[] = L"窗体标题";
此时,szTitle字符串使用的的是Unicode编码,加入你的程序以unicode方式编译,在任何语言的Windows上都能显示正常。
字符编码的转换
有时候你从外部文件读进来的字符串是MBCS编码(如GB2312),而你程序里面都是统一用Unicode处理字符串,这时候要进行字符编码转换。 Windows为我们提供了很好用的API函数 MultiByteToWideChar 和 WideCharToMultiByte 帮我们轻松实现转换。 代码如下:
GB2312 转换成 Unicode:
{
UINT nCodePage = 936; //GB2312
int nLength=MultiByteToWideChar(nCodePage,0,szGBString,-1,NULL,0);
wchar_t* pBuffer = new wchar_t[nLength+1];
MultiByteToWideChar(nCodePage,0,szGBString,-1,pBuffer,nLength);
pBuffer[nLength]=0;
return pBuffer;
}
{
UINT nCodePage = 950; //BIG5
int nLength=MultiByteToWideChar(nCodePage,0,szBIG5String,-1,NULL,0);
wchar_t* pBuffer = new wchar_t[nLength+1];
MultiByteToWideChar(nCodePage,0,szBIG5String,-1,pBuffer,nLength);
pBuffer[nLength]=0;
return pBuffer;
}
{
UINT nCodePage = 936; //GB2312
int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
char* pBuffer=new char[nLength+1];
WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
pBuffer[nLength]=0;
return pBuffer;
}
{
UINT nCodePage = 950; //BIG5
int nLength=WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,NULL,0,NULL,NULL);
char* pBuffer=new char[nLength+1];
WideCharToMultiByte(nCodePage,0,szUnicodeString,-1,pBuffer,nLength,NULL,NULL);
pBuffer[nLength]=0;
return pBuffer;
}
利用Unicode作为媒介,还可以做出很有意思的应用。在处理中文过程中,一个经常用到的功能就是繁体和简体的互相转换。 代码如下:
繁体中文BIG5 转换成 简体中文 GB2312
{
LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);
wchar_t* szUnicodeBuff = BIG5ToUnicode(szBIG5String);
char* szGB2312Buff = UnicodeToGB2312(szUnicodeBuff);
int nLength = LCMapString(lcid,LCMAP_SIMPLIFIED_CHINESE, szGB2312Buff,-1,NULL,0);
char* pBuffer = new char[nLength + 1];
LCMapString(0x0804,LCMAP_SIMPLIFIED_CHINESE,szGB2312Buff,-1,pBuffer,nLength);
pBuffer[nLength] = 0;
delete[] szUnicodeBuff;
delete[] szGB2312Buff;
return pBuffer;
}
{
LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC);
int nLength = LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,NULL,0);
char* pBuffer=new char[nLength+1];
LCMapString(lcid,LCMAP_TRADITIONAL_CHINESE,szGBString,-1,pBuffer,nLength);
pBuffer[nLength]=0;
wchar_t* pUnicodeBuff = GB2312ToUnicode(pBuffer);
char* pBIG5Buff = UnicodeToBIG5(pUnicodeBuff);
delete[] pBuffer;
delete[] pUnicodeBuff;
return pBIG5Buff;
}
文本文件读写的编码问题
当你的程序读一个文本文件时,如何判断文件中的字符是MBCS格式还是Unicode格式? Windows定义了一个"字节顺序标记"(Byte-order Mark)的概念:当一个txt文件的前2个字节为FF FE时,这个文件里面的字符采用Unicode编码, 如果没有字节顺序标记,就是MBCS编码。更多关于字节顺序标记的说明,请看 MSDN的官方资料。
参加公司活动的一些感悟(关于团队的制度)
团队,究竟是什么制度的?拓展训练据说是要问这个问题的。
在训练的一个游戏上,似乎感悟到了一点东西,不敢藏掖,遂贴于此。
10个人站在两根平行放置的木板上,两根木板很重,一个人抬不起来,每个木板上隔一段距离绑一根绳子,共绑有10根绳子。十个人站在这两根木板上,左右手各自抓握对应的一组绳子,然后向前迈进。
这个游戏的关键是:
1 当十个人同时迈左脚时,必须把重心全部放到右脚上而使左脚悬空,否则通过拉绳子是拉不起来左边的这块木板的。右边的木板也同理。
2 必须有人指挥,否则,即便9个人迈了左脚,只要有一个人迈了右脚,就走不动。
3 只有十个人同时迈左脚,或者迈右脚时,才能走动。
关键就是指挥。
前三个团队都是一个人指挥十个人,我们称这种制度为“民主集中制”。他们都在预定时间完成了任务,最快的一组:1分47秒。
我们团队的制度不同,我们是十个人同时呐喊口号,指挥者反倒晾在一边,这种制度大凡类似于“自由制”。结果是,我们团队速度最快,本可以在1分30秒左右冲线。由于十个人同时呐喊,在呐喊的同时每个人就知道自己该做什么,所以,速度非常快。十个人身形绝对统一,完美,近乎完美。
但,离终点只剩一点的地方,已经1分29秒了,我们遇到了一个小Bug。剩下的事情就……
十个人试图四次同时再次呐喊,但是每次,大家虽然都喊得很统一,但就是有人的身形无法跟上。第五次,不得不由一直被晾在一边的队长重新发令,我们破线的时候已经是2分了。
很可惜。
这似乎也折射出了团队制度的一些问题。
民主集中制,制度是一切,民主商议得到的结果,经由少数人形成决议,并将这些决议形成制度。而所有人,必须按照制度进行工作,不允许任何人有特殊化。民主集中制的结果,取决于决议形成的制度,也就是一开始的参议和决策过程。这个过程只要没有问题,那么最后最起码是能完成一个结果的,只不过可能不尽善尽美,但起码是可以达到的。这是大多数企业使用的管理模式——只不过很多企业是畸形的,参议权没有团队成员的份,少数人参议,少数人决议,少数人独裁——转化成了彻头彻尾的独裁制,在这个行业里混的兄弟姐妹们可不要告诉我你没看到过这种公司。好来不及鄙视他们,因为独裁不是我们的重点,而且这些企业现在都是某些势力的宠儿,别的不说什么,我们还得顾及自己的小命不是~。
民主集中制主要的效率问题是发生在执行期,执行的效率一般都比较低。因为制度和进度表一旦形成,人固有的惰性总会不由自主地向这个进度去靠,即便人们可以自觉自发地完成得更快更好,但是,制度相当于为人们的懒惰提供了法律依据。因此会有人说“项目总会超期,即便认识到这一点也是如此……”。但你如果是单枪匹马做一个小游戏,那么你反倒发现“项目总会早于预期的时间,即便认识到这一点也是如此……”了,这大约就是民主集中制的一些影响吧。^_^
另外,在民主集中制下,团队的凝聚力仅限于参议阶段,而非执行阶段,因此,也大打折扣。但与此同时,大团队的组织才有了可能。10个人的团队可以在执行期互通有无,拚命向前赶进度,但100个人呢?1000个人呢?
而自由制,它的好处是,对于小但素质高的团队、小目标而言,执行期的效率很高,每个人都会知道自己该做什么,也会努力去完成。但是,一旦发生方向性的或者重大的分歧,重新整合的难度会加大。
个人认为,民主集中制更适合正规而项目相对中型的团队,而自由制则适合于小型项目、小而稳定的团队,也就是小作坊。
制度没有好坏,没有最好的制度,没有最坏的制度,只有最适应的制度。一定的情况下,独裁也是好的抉择。用在团队上合适,用在社会上也合适。
制度就如同工具一般,只不过这种工具切换的时候总要有些麻烦,因此有时要刻意避免制度的切换。形而上学地去讨论制度的好坏,倒不如务实地分析自己所处的情况,选择对自己最有利的制度——哪怕是“德国国家社会主义”(考虑到某些神经脆弱的网友的请求,我以后绝对不会再用“纳粹”这个词)制度,在必要的历史时期也是可以选择的。
任何制度都会有弊端,也都会有相应地优点,因此,更重要的是分析自己,而不是盲目地跟随着上个世纪7、80年代的狂徒们一起去叫嚣“XX制度就是好”“XX制度就是不好”。已经21世纪了,我们毕竟应该像个人一样地活着,要有自己的头脑,用自己的分析,获得自己的结果。
嗯,好吧,偶然想到的也就写下来了。其实对于我大凡是没有区别的,作为团队的一员,发挥自己的参议权和主观能动性,在决议之后,按照已经生成的决议完成自己该做的工作,这大凡就是我们应该付出的责任吧。虽然我可能打心眼里喜欢那种狂放不羁的自由(谁不喜欢啊!),但是,或许更需要明白的是身为一个员工,身上沉甸甸的职责!
一个程序员的奋斗
这是我收藏的一篇文章,每每在遇到挫折的时候就拿出来读一读,总是能给我动力!
这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能够为国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向 ,所以把我的经历写出来与大家共勉,希望能给刚如行的朋友们一点点帮助。 一转眼我在IT行业学习工作已经七年多了,这期间我做过网页,写过MIS、数据库,应用程序,做过通信软件、硬件驱动、协议栈,到现在做操作系统内核和IC相关开发,这中间走了很多弯路,也吃了不少苦。
开源引擎
一、底层开发包和工具
1.
http://www.mesa3d.org
Mesa 是一个类OpenGL(
http://www.opengl.org )的开源实现。
2.
http://openil.sourceforge.net
DevIL (即以前的OpenIL)是一个跨平台的图形处理包,支持
BMP、JPG、GIF 等多种图形文件格式。
二、2D 游戏开发包
1.
http://www.libsdl.org/
http://www-900.ibm.com/developerWorks/cn/linux/theme/special/
SDL(Simple DirectMedia Layer)是一个跨平台的多媒体和游戏开
发包,提供2D、音频、事件驱动、多线程和定时器等服务,并有大
量的扩充开发包,如TCP/IP 网络、游戏角色、混音等。SDL 是用C
开发的,但也有Perl、PHP、Delphi 等多种语言的版本。
2.
http://www.clanlib.org
ClanLib 是一个通用的C++游戏开发包,提供游戏资源操作、网络
对象处理、GUI 主题和游戏脚本等支持。支持Windows 和Linux。
PMT Files – Open Source Game Development
三、3D 引擎和游戏开发包
1.
http://crystal.sourceforge.net/
Crystal Space 是一个用C++开发的3D 游戏开发包。有丰富的
功能,支持Direct3D、OpenGL、Glide 等。
2.
http://ogre.sourceforge.net/
OGRE 是一个面向对象的3D 引擎,支持DirectX、OpenGL 和
Glide 等。
3.
http://hem.passagen.se/opengl/glfw/
GLFW 是一个OpenGL 的应用框架,支持Linux 和Windows。
4.
http://apocalyx.sourceforge.net/
Apocalyx 是一个基于OpenGL 的3D 引擎。
5.
http://www.faktiss.net/
Nive 是一个C++ 3D 引擎,基于OpenGL 和
DevIL,支持Windows 和Linux/Xwindow。
6.
http://plib.sourceforge.net/
Plib 是一个3D 游戏开发包。
7.
http://alleg.sourceforge.net/ Allegro 是一个跨平台的C/C++游戏开发包,提供2D、3D、声效、用
户输入、文件、压缩、GUI 等功能。
PMT Files – Open Source Game Development
四、游戏和游戏框架
1.
http://www.freecraft.org/
FreeCraft 是一个实时战略游戏(RTS)框架。
2.
http://www.worldforge.org/ Worldforge 是一个完整的大型网络RPG 游戏框架。
3.
http://arianne.info/
Arianne 是一个大型网络RPG 游戏,同时也是一个游戏框架。
五、其他
1.
http://openai.sourceforge.net/ OpenAI 是一个人工智能的工具包,包括神经网络、遗传算
法、有限状态机等。
一、英文网站
1.
http://www.flipcode.com/
Daily Game Development News & Resources
2.
http://www.gamedev.net/
All Your Game Development Needs
3.
http://www.gamedeveloper.net/
4.
http://www.gametutorials.com/
Game Programming with Personality, From Start to Finish
5.
http://www.cfxweb.net/
Demo & Game Development
6.
http://www.gdse.com
The Game Programming and Design Search Engine
7.
http://www.2dgame-tutorial.com
8.
http://www.gamasutra.com/
CMP - The Art & Science of Making Games
9.
http://www.gdmag.com/
CMP - Game Developer Magazine
二、中文网站
1.
http://www.gameres.com/
中文游戏开发技术资料和交流
2.
http://mays.soage.com/
中国游戏开发者
3.
http://www.gpgame.net
金点工作室
4.
http://www.codingnow.com
云风工作室
5.
http://lightwing.myrice.com/
琴心剑胆
6.
http://www.diamondgarden.net/
钻石花园
7.
http://www.joynb.com/
无名鸟游戏工作室
8.
http://www.npc6.com/
何苦做游戏,游戏制作的文化
PMT Files – Game Development Website
三、Linux 游戏及其开发网站
1.
http://www.happypenguin.org
The Linux Game Tome
2.
http://linuxgames.com/
Linux Games - For the people
3.
http://h.webring.com/webring?ring=linuxgp;list
Linux Game Programming Webring
微软C/C++编译器选项参考
- 优化
/O1最小化空间 minimize space/Op[-]改善浮点数一致性 improve floating-pt consistency/O2最大化速度 maximize speed/Os优选代码空间 favor code space/Oa假设没有别名 assume no aliasing/Ot优选代码速度 favor code speed/Ob内联展开(默认 n=0) inline expansion (default n=0)/Ow假设交叉函数别名 assume cross-function aliasing/Od禁用优化(默认值) disable optimizations (default)/Ox最大化选项。(/Ogityb2 /Gs) maximum opts. (/Ogityb1 /Gs)/Og启用全局优化 enable global optimization/Oy[-]启用框架指针省略 enable frame pointer omission/Oi启用内建函数 enable intrinsic functions
- 代码生成
/G3为 80386 进行优化 optimize for 80386/G4为 80486 进行优化 optimize for 80486/GR[-]启用 C++ RTTI enable C++ RTTI/G5为 Pentium 进行优化 optimize for Pentium/G6为 Pentium Pro 进行优化 optimize for Pentium Pro/GX[-]启用 C++ 异常处理(与 /EHsc 相同) enable C++ EH (same as /EHsc)/EHs启用同步 C++ 异常处理 enable synchronous C++ EH/GD为 Windows DLL 进行优化 optimize for Windows DLL/GB为混合模型进行优化(默认) optimize for blended model (default)/EHa启用异步 C++ 异常处理 enable asynchronous C++ EH/Gd__cdecl调用约定__cdeclcalling convention/EHcextern "C"默认为 nothrow extern “C” defaults to nothrow/Gr__fastcall调用约定__fastcallcalling convention/Gi[-]启用增量编译 enable incremental compilation/Gz__stdcall调用约定__stdcallcalling convention/Gm[-]启用最小重新生成 enable minimal rebuild/GA为 Windows 应用程序进行优化 optimize for Windows Application/Gf启用字符串池 enable string pooling/QIfdiv[-]启用 Pentium FDIV 修复 enable Pentium FDIV fix/GF启用只读字符串池 enable read-only string pooling/QI0f[-]启用 Pentium 0x0f 修复 enable Pentium 0x0f fix/Gy分隔链接器函数 separate functions for linker/GZ启用运行时调试检查 enable runtime debug checks/Gh启用钩子函数调用 enable hook function call/Ge对所有函数强制堆栈检查 force stack checking for all funcs/Gs[num]禁用堆栈检查调用 disable stack checking calls
- 输出文件
/Fa[file]命名程序集列表文件 name assembly listing file/Fo命名对象文件 name object file/FA[sc]配置程序集列表 configure assembly listing/Fp命名预编译头文件 name precompiled header file/Fd[file]命名 .PDB 文件 name .PDB file/Fr[file]命名源浏览器文件 name source browser file/Fe命名可执行文件 name executable file/FR[file]命名扩展 .SBR 文件 name extended .SBR file/Fm[file]命名映射文件 name map file
- 预处理器
/FI命名强制包含文件 name forced include file/C不吸取注释 don’t strip comments/U移除预定义宏 remove predefined macro/D{=|#}定义宏 define macro/u移除所有预定义宏 remove all predefined macros/E将预处理定向到标准输出 preprocess to stdout/I添加到包含文件的搜索路径 add to include search path/EP将预处理定向到标准输出,不要带行号 preprocess to stdout, no #line/X忽略"标准位置" ignore “standard places”/P预处理到文件 preprocess to file
- 语言
/Zi启用调试信息 enable debugging information/Zl忽略 .OBJ 中的默认库名 omit default library name in .OBJ/ZI启用调试信息的"编辑并继续"功能 enable Edit and Continue debug info/Zg生成函数原型 generate function prototypes/Z7启用旧式调试信息 enable old-style debug info/Zs只进行语法检查 syntax check only/Zd仅要行号调试信息 line number debugging info only/vd{0|1}禁用/启用 vtordisp disable/enable vtordisp/Zp[n]在 n 字节边界上包装结构 pack structs on n-byte boundary/vm指向成员的指针类型 type of pointers to members/Za禁用扩展(暗指 /Op) disable extensions (implies /Op)/noBool禁用bool关键字 disable “bool” keyword/Ze启用扩展(默认) enable extensions (default)
- 杂项
/?, /help打印此帮助消息 print this help message/c只编译,不链接 compile only, no link/W设置警告等级(默认 n=1) set warning level (default n=1)/H最大化外部名称长度 max external name length/J默认 char 类型是 unsigned default char type is unsigned/nologo取消显示版权消息 suppress copyright message/WX将警告视为错误 treat warnings as errors/Tc将文件编译为 .c compile file as .c/Yc[file]创建 .PCH 文件 create .PCH file/Tp将文件编译为 .cpp compile file as .cpp/Yd将调试信息放在每个 .OBJ 中 put debug info in every .OBJ/TC将所有文件编译为 .c compile all files as .c/TP将所有文件编译为 .cpp compile all files as .cpp/Yu[file]使用 .PCH 文件 use .PCH file/V设置版本字符串 set version string/YX[file]自动的 .PCH 文件 automatic .PCH/w禁用所有警告 disable all warnings/Zm最大内存分配(默认为 %) max memory alloc (% of default)
- 链接
/MD与 MSVCRT.LIB 链接 link with MSVCRT.LIB/MDd与 MSVCRTD.LIB 调试库链接 link with MSVCRTD.LIB debug lib/ML与 LIBC.LIB 链接 link with LIBC.LIB/MLd与 LIBCD.LIB 调试库链接 link with LIBCD.LIB debug lib/MT与 LIBCMT.LIB 链接 link with LIBCMT.LIB/MTd与 LIBCMTD.LIB 调试库链接 link with LIBCMTD.LIB debug lib/LD创建 .DLL Create .DLL/F设置堆栈大小 set stack size/LDd创建 .DLL 调试库 Create .DLL debug libary/link链接器选项和库 linker options and libraries
这几本游戏编程书籍你看过吗?
《Advanced Animation with DirectX》
这本书主要讲的是怎样用DirectX9来完成游戏中的动画,主要是移动、骨骼动画等等,也涉及了不少的3d模型的知识。这本书起步比较的高,没有讲太多的DirectX9的基础,但是章节安排得十分合理,由简入难,是一本初学者和高手都比较适用的书。
让UltraEdit 支持Lua的语法高亮显示
其实很简单,但如像我一样不怎么用UltraEdit的朋友们来说,可能不太清楚。首先去UltraEdit的官网下载支持Lua的Wordfiles文件(这里),是个文本文件(lua.txt)。打开UltraEdit安装目录下的wordfile.txt,把lua.txt文件中的内容拷贝粘贴到wordfile.txt的末尾,存盘,OK
,于是UltraEdit语法高亮项多出Lua一项,可以选择使用了。其他语言的语法高亮支持与此类似。
一个NOD32的升级补丁
直接贴代码吧,保存成**.reg,导入就可以了,感谢cnnod32cn.cn提供服务器.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Eset\Nod\CurrentVersion\Modules\Update\Settings] “PROFILES_ENABLED”=dword:00000000 “DefaultServerCount”=dword:00000005 “DefaultServer0”=“
http://u1.cnnod32.cn
” “DefaultServer1”=“
http://u2.cnnod32.cn
”
VC编程规范—程序员应该这样写代码
VC编程规范-程序员应该这样写代码
基本要求
1.1 程序结构清析,简单易懂,单个函数的程序行数不得超过100行。
1.2 打算干什么,要简单,直接了当,代码精简,避免垃圾程序。
一个睡五分钟等于六个钟头的方法!
一个人真正睡着觉最多只有两个钟头,其余都是浪费时间,躺在枕头上做梦,没有哪个人不做梦。至于醒来觉得自己没有做梦,那是因为他忘记了。通常一个人睡两个钟头就够了,为什么有人要睡七、八个钟头?那是你赖床躺在枕头上休息的习惯养成的,并非我们需要那么久的睡眠时间,尤其打坐做功夫的人晓得,正午只要闭眼真正睡着三分钟,等于睡两个钟头,不过要对好正午的时间。夜晚则要在正子时睡着,五分钟等于六个钟头。就这个时间的学问又大了,同宇宙法则、地球法则、易经阴阳的道理有关系,而且你会感觉到,心脏下面硬是有一股力量降下来,与丹田(肾上)的力量融合,所谓“水火既济”,豁然一下,那你睡眠够了,精神百倍。所以失眠或真要夜里熬夜的人,正子时的时刻,哪怕 二十分钟也一定要睡,睡不着也要训练自己睡着。过了正子时大约十二点半以后,你不会想睡了,这很糟糕。更严重的,到了天快亮,四、五点钟,五、六点卯时的时候,你又困得想睡,这时如果一睡,一天都会昏头。所以想从事熬夜工作的人,正子时,即使有天大的事也要摆下来,睡它半小时,到了卯时(7:00)想睡觉千万不要睡,那一天精神就够了。不过失眠的人都挨过十二点,在床上翻来覆去睡不着,结果快天亮睡着了,到第二天下午都昏头昏脑,因此你会感觉失眠、睡眠不足,实际上是你没有经验。
大家可以试试看看效果吧。