<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
 <title><![CDATA[汉化新世纪 -- 最专业的软件汉化原创、下载、教学站]]></title>
 <link><![CDATA[http://www.hanzify.org]]></link>
 <description><![CDATA[汉化新世纪 -- 最专业的软件汉化原创、下载、教学站]]></description>
 <copyright><![CDATA[&lt;a href=&quot;http://www.hanzify.org&quot;&gt;&lt;font color=#FFFFFF&gt;汉化新世纪&lt;/font&gt;&lt;/a&gt;]]></copyright>
 <generator><![CDATA[Hanzify.org System by MuWing]]></generator>
 <lastBuildDate><![CDATA[Sat, 04 Jul 2009 13:47:51 +0800]]></lastBuildDate>
 <image>
   <url><![CDATA[http://www.hanzify.org/Main/Template/Images/biaoti1.gif]]></url>
   <title><![CDATA[汉化新世纪 -- 最专业的软件汉化原创、下载、教学站]]></title>
   <link><![CDATA[http://www.hanzify.org]]></link>
   <description><![CDATA[汉化新世纪 -- 最专业的软件汉化原创、下载、教学站]]></description>
 </image>
<item>
 <title><![CDATA[MultiByteToWideChar 一例乱码的解决]]></title>
 <description><![CDATA[正在汉化 iZotope Ozone 4 这个软件，但翻译后发现乱码。跟踪了一下，发现字符串经过 MultiByteToWideChar 这个函数后应该是由 ASCII 码转为 UNICODE，英文转换正常，而中文则转换为乱码。看了一下此函数的参数，如下图，栈顶是 CodePage ，也就是代码页，最后入栈：PUSH EBP ，发现其数值并不熟悉。打开注册表搜索 CodePage ，看到了我们熟悉的 GB2312 936 。把所有 MultiByteToWideChar 下断点跟踪了一下，把最后的代码页参数值都改成了 000003A8 。看看实际运行的结果，正常显示中文了。
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::678-1245165791]]></link>
 <author><![CDATA[海子]]></author>
 <category><![CDATA[特殊汉化]]></category>
 <pubDate><![CDATA[Tue, 16 Jun 2009 23:23:11 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[一款软件的乱码处理 - 看二位高手的不同解决方案]]></title>
 <description><![CDATA[问题文件
wanfu的问题：
我汉化了一款VC软件，该软件有标准资源和Uncode和ASCII非标字符，我已修改了所有标准资源中的字体和语系为简体中文，但是修改主程序中的ASCII非标字符为简体中文时，结果在&ldquo;验证&rdquo;的列表框中显示乱码。我试图改为UFT-8和Uncode也没有成功。试图用OllyDBG修改，只找到与字体设置相关的CreateFontW模块，字符设置 CharSet = DEFAULT_CHARSET 应该不用改。
哪位高手可以帮助我？文件在此：&nbsp; &nbsp;LOOMConfig.rar ( 314.42k ) 下载次数: 20
问题所在
cao_cong的答复：
你这个是程序的转码问题。比如你汉化的验证列表框中的第一个&ldquo;添加&ldquo;&lt;%s&gt;&rdquo;标记将改变文档&ldquo;%s&rdquo;的格式和/或结构。&rdquo;，ASCII码是CCEDBCD3A1B03C25733EA1B1B1EABCC7BDABB8C4B1E4CEC4B5B5A1B02573A1B1B5C4B8F1CABDBACD2FBBF2BDE1B9B9A1A3，程序转换成MultiByte，成为CC00ED00BC00D300A100B0003C00250073003E00A100B100B100EA00BC00C700BD00AB00B800C400B100E400CE00C400B500B500A100B00025007300A100B100B500C400B800F100CA00BD00BA00CD002F00BB00F200BD00E100B900B900A100A300，而最后显示的应该是UNICODE，对应你的翻译最后应该显示的是UNICODE编码FB6DA0521C203C00250073003E001D200768B08B065C3965D853876563681C20250073001D2084763C680F5F8C542F001662D37E84670230，可程序没干这事，给你转换成MultiByte它就完事了。所以你英文显示正常，变成中文宽字符时肯定不正常了。貌似除了在程序中写转换字符的补丁代码外没啥更好的方法。贴个效果图：弄起来应该也比较麻烦。我有空的话就帮你搞一下，也对你那个老盖的工具比较感兴趣，想瞅瞅 

附加缩略图 
解决方案
restools的解决方案（1）
汇编不在行，所以打洞放代码的功夫就留待高人来实现了，我的方法很简单，作了个DLL，里面有个函数，然后让软件的处理变成调用我的DLL来处理。我还是喜欢这种方式，因为我不需要在软件中寻找合适位置放置合适代码，而且这需要很强的ASM代码整合能力，一不小心，可能引起异常（这里花的时间绝对不会少）。虽然这不是完美的实现方法，但是对于汉化这样的工程，如果不是为了技术探讨，大可不必做到非常完美，只需要实现效果即可。DLL做出来了，用来参考，可把里面反汇编的代码稍作修改应该可以在原程序上放置实现更完美的效果。
附加文件 &nbsp;LM.rar ( 73.28k ) 下载次数: 25


    
        
            cao_cong的评价（解释了原理和用法）：
            restools 兄这个方法好！比直接在程序中写补丁代码简单多了，学习！我看了你改的主程序，应该是用LordPE添加了你DLL中的导出函数，把一个调用SendMessageW的地方改成调用你的函数。严重学习！
            
        
    

cao_cong的解决方案 
再来一个打过补丁的。本来想用LordPE直接添加程序中没有的函数WideCharToMultiByte和SendMessageA的，看了一下程序中有LoadLibraryA和GetProcAddress这两个函数，想想还是用这两个函数来获取WideCharToMultiByte和SendMessageA函数地址吧。因为调用的都是系统函数，我就不考虑用FreeLibrary来释放了。原本想直接抄restools兄的DLL文件中的代码来补丁的，不过堆栈平衡实在不大好处理，反而耗了我很多时间。最后干脆直接写了。我在程序的最后添加了一个大小为400H的区段用来写代码，主要是在程序中找不到够写代码的空间了。贴上用于OllyDBG的写补丁代码插件NonaWrite的代码，我在里面都加了注释，应该容易理解。在程序中添加一个区段后就可以用OD载入，再用NonaWrite插件把这些代码直接写到程序中保存就行了：


    
        
            变量：;temp1：用来存放用GetProcAddress获取的WideCharToMultiByte函数地址。;偏移：00039639，VA：0043B039;temp2：用来存放用GetProcAddress获取的SendMessageA函数地址。;偏移：0003963E，VA：0043B03E;temp3：用来保存调用SendMessageW时的句柄。;偏移：00039643，VA：0043B043;temp4：用来保存要转换的字串地址。;偏移：00039648，VA：0043B048;temp5：分配200字节用来作为转换字串的缓冲区;偏移：00039660，VA：0043B060;结束偏移：00039860，VA：0043B260;常量：;const1：用来存放字串KERNEL32.dll。;偏移：39600，RVA：00032C70，VA：0043B000;const2：用来存放字串WideCharToMultiByte。;偏移：3960D，VA：0043B00D;const3：用来存放字串USER32.dll。;偏移：39621，VA：0043B021;const4：用来存放字串SendMessageA。;偏移：3962C，VA：0043B02C;其他：;LoadLibraryA：;VA：40105C;GetProcAddress：;VA：401060;原程序中还要在418508处改一下：;0x418508:;call 43B270&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;改成这个;补丁代码：开始地址为0043B270;获取WideCharToMultiByte和SendMessageA函数：0x43B270:pushadmov eax,[esp+24]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;temp3,保存前面修改SendMessageW时的句柄mov dword ptr [0043B043],eaxmov eax,[esp+30]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;temp4,保存要转换的字串地址mov dword ptr [0043B048],eaxcmp dword ptr [0043B039],0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;判断是否已获取了要用的函数jnz 43B2ab&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;out1push 0043B000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;const1call dword ptr[40105C]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;调用LoadLibraryApush 0043B00D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;const2push eaxcall dword ptr[401060]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;调用GetProcAddressmov dword ptr [0043B039],eax&nbsp;&nbsp; ;保存WideCharToMultiByte函数地址到temp1;out1cmp dword ptr [0043B03E],0jnz 43B2d1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;out2push 0043B021&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;const3call dword ptr[40105C]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;调用LoadLibraryApush 0043B02C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;const4push eaxcall dword ptr[401060]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;调用GetProcAddressmov dword ptr [0043B03E],eax&nbsp;&nbsp; ;保存SendMessageA函数地址到temp2;out2,开始转换push&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; lpUsedDefaultCharpush&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; lpDefaultCharpush&nbsp;&nbsp;&nbsp;&nbsp;200&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; cchMultiBytepush&nbsp;&nbsp;&nbsp;&nbsp;0043B060&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; temp5,lpMultiByteStrpush&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; cchWideCharpush&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [0043B048]&nbsp;&nbsp;&nbsp;&nbsp; ; temp4,lpWideCharStrpush&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; dwFlagspush&nbsp;&nbsp;&nbsp;&nbsp;4E4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; CodePagecall&nbsp;&nbsp;&nbsp;&nbsp;dword ptr[0043B039]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;调用WideCharToMultiBytemov&nbsp;&nbsp;&nbsp;&nbsp;eax,0043B060push&nbsp;&nbsp;&nbsp;&nbsp;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; lParampush&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; wParampush&nbsp;&nbsp;&nbsp;&nbsp;180&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Message = LB_ADDSTRINGpush&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [0043B043]&nbsp;&nbsp;&nbsp;&nbsp; ; hWndcall&nbsp;&nbsp;&nbsp;&nbsp;dword ptr[0043B03E]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;调用SendMessageApopadret 10
        
    


&nbsp;附件是修改过的主程序： &nbsp;LOOMConfig.rar ( 72.46k ) 下载次数: 4
&nbsp;restools的解决方案（2）
既然cc兄作了相当完美的解决方案出来，那我就借用一下，再把它处理的完善已点，以下的修改


    
        
            ;变量：;首先，文件没有扩展任何实际大小，所有代码，常量都在文件的空隙中存放，至于变量，大部分使用的是虚的空间。这样做是因为文件实际上是没有足够实际空间的。;先把文件的text段虚拟大小用尽也就是2F00，这不影响原来的程序结构的，据测试，好像改不改都可以用，不过还是按规矩修改了;再把文件的data段虚拟大小用尽也就是3000，这不影响原来的程序结构的，据测试，好像改不改都可以用，不过还是按规矩修改了;开放text的写入功能，使变量可以写入;temp1：用来存放用GetProcAddress获取的WideCharToMultiByte函数地址。 ---把text段虚拟空间扩展到2F000，变量运行时放到虚的位置，就是文件中并不存在的位置;VA：42FE28;temp2：用来存放用GetProcAddress获取的SendMessageA函数地址。---同上;VA：42FE2E;temp3：用来保存调用SendMessageW时的句柄。---同上;VA：42FE34;temp4：用来保存要转换的字串地址。---同上;VA：42FE3A;temp5：分配190字节用来作为转换字串的缓冲区 ---放到 Data 段空闲位置，大部分是虚的，文件没有实位置;VA：432E60 --使用靠在后面扩展的虚拟空间，因为这个段大多数会有数据写入，前面已经分配的虚拟空间不太安全;0x190 就是 400 个字节，对于这个程序，我想应该足够了;常量：;const1：用来存放字串KERNEL32.dll。---------------------------原程序已有该字串，借用，省去空间;VA：42F602;const2：用来存放字串WideCharToMultiByte。---放到 text 段空闲位置 ，文件实位置;VA：42FDE0;const3：用来存放字串USER32.dll。---------------------------原程序已有该字串，借用，省去空间;VA：42F6D4;const4：用来存放字串SendMessageA。---放到 text 段空闲位置 ，文件实位置;VA：42FDF4;其他：;LoadLibraryA：;VA：40105C;GetProcAddress：;VA：401060;原程序中还要在418508处改一下：;0x418508:;call 42FD3E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;改成这个;补丁代码：开始地址为0042FD3E;获取WideCharToMultiByte和SendMessageA函数：0x42FD3E:pushadmov eax,[esp+24]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;temp3,保存前面修改SendMessageW时的句柄， ListBox 句柄mov dword ptr [42FE34],eaxmov eax,[esp+30]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;temp4,保存要转换的字串地址， 错误字符串的地址，准备用来修复mov dword ptr [42FE3A],eaxcmp dword ptr [42FE28],0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;temp1,WideCharToMultiByte判断是否已获取了要用的函数，如果有跳转，不再获取jnz 42FD7C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;out1push 42F602&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;const1call dword ptr[40105C]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;调用LoadLibraryApush 42FDE0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;const2push eaxcall dword ptr[401060]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;调用GetProcAddressmov dword ptr [42FE28],eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;保存WideCharToMultiByte函数地址到 temp1;out1cmp dword ptr [42FE2E],0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;temp2,判断是否已获取了要用的函数，如果有跳转，不再获取jnz 43FDA2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;out2push 42F6D4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;const3,字串USER32.dllcall dword ptr[40105C]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;调用LoadLibraryApush 42FDF4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;const4,字串SendMessageApush eaxcall dword ptr[401060]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;调用GetProcAddressmov dword ptr [42FE2E],eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;保存SendMessageA函数地址到temp2;out2,开始转换push&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; lpUsedDefaultCharpush&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; lpDefaultCharpush&nbsp;&nbsp;&nbsp;&nbsp;190&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; cchMultiBytepush&nbsp;&nbsp;&nbsp;&nbsp;432E60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; temp5,lpMultiByteStrpush&nbsp;&nbsp;&nbsp;&nbsp;-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; cchWideCharpush&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [42FE3A]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; temp4,lpWideCharStrpush&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; dwFlagspush&nbsp;&nbsp;&nbsp;&nbsp;4E4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; CodePagecall&nbsp;&nbsp;&nbsp;&nbsp;dword ptr[42FE28]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; temp1,调用WideCharToMultiBytemov&nbsp;&nbsp;&nbsp;&nbsp;eax,432E60&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 输出正确的 ANSI 字符串push&nbsp;&nbsp;&nbsp;&nbsp;eax&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; lParampush&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; wParampush&nbsp;&nbsp;&nbsp;&nbsp;180&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Message = LB_ADDSTRINGpush&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [42FE34]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; temp3,hWndcall&nbsp;&nbsp;&nbsp;&nbsp;dword ptr [42FE2E]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; 调用SendMessageApopadret 10
        
    


文件没增加一个字节，资源段仍然处在最后位置，可以用资源编辑工具继续编辑而无需担心。附加文件 &nbsp;LOOMConfig.rar ( 72.43k ) 下载次数: 5]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::677-1241915537]]></link>
 <author><![CDATA[wanfu]]></author>
 <category><![CDATA[编程知识]]></category>
 <pubDate><![CDATA[Sun, 10 May 2009 08:32:17 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[Radialix.2.06.1.1267 脱壳演示]]></title>
 <description><![CDATA[Radialix&nbsp;是一个来自俄罗斯的本地化工具，官方网站是&nbsp;http://www.radialix.com/index.php?lang=en程序是采用&nbsp;Armadillo&nbsp;的&nbsp;CopyMem-II&nbsp;方式加壳的。应汉化新世纪某位朋友的要求，做了一个脱壳及破解的录像，顺便在这里也发一下。有一点基础的话，按录像操作应该可以搞定这个软件了。发觉做录像太累，下次不搞这个了。以下是里面说明文件中的内容：文件列表：Radialix_Crack_Demo.swf：Radialix&nbsp;2.06.1.1267&nbsp;中&nbsp;rdl.exe&nbsp;脱壳及破解的录像Tools&nbsp;文件夹中内容：1、ArmaDetach.v1.31&nbsp;目录：用来&nbsp;dump&nbsp;Armadillo&nbsp;采用&nbsp;CopyMem-II&nbsp;方式加密程序的工具2、ArmadilloFindProtected18&nbsp;目录：用来检测&nbsp;Armadillo&nbsp;加密方式3、PEMOVE&nbsp;目录：kanxue&nbsp;兄写的用来移动输出表及重定位表的工具4、Plugin&nbsp;目录：用于&nbsp;OllyDBG&nbsp;的插件。HA_skypatch.rar&nbsp;中是我汉化过的&nbsp;SkyPatch&nbsp;补丁脚本插件，根据里面的说明安装即可。ODbgScript.dll&nbsp;是&nbsp;1.65&nbsp;版的&nbsp;OllyDBG&nbsp;脚本插件，直接复制到&nbsp;OllyDBG&nbsp;或&nbsp;OllyICE&nbsp;的&nbsp;plugin&nbsp;目录下即可。5、Script&nbsp;目录：我写的&nbsp;Armadillo&nbsp;脱壳脚本，配合&nbsp;OllyDBG&nbsp;的&nbsp;ODbgScript&nbsp;插件使用6、Code&nbsp;目录：破解&nbsp;Radialix&nbsp;的补丁代码，配合&nbsp;OllyDBG&nbsp;插件&nbsp;SkyPatch&nbsp;使用。其中的&nbsp;Radialix.2.06.00.odp&nbsp;我已改过，可用于&nbsp;Radialix&nbsp;2.06.1.1267&nbsp;中&nbsp;rdl.exe&nbsp;脱壳后的破解，rdlc.2.06.00.odp&nbsp;我没改，这个是用于破解脱壳后的&nbsp;Radialix&nbsp;安装目录中的控制台程序&nbsp;rdlc.exe&nbsp;的，不适用于&nbsp;Radialix&nbsp;2.06.1.1267&nbsp;版本，请自己修改。脱壳破解的方法我都在录像中说明了，这个就当做练习。7、脱壳后的程序调整区段时按顺序保留以下的部分：01&nbsp;.text02&nbsp;.itext03&nbsp;.data04&nbsp;.bss05&nbsp;.idata06&nbsp;.edata07&nbsp;.tls08&nbsp;.rdata09&nbsp;.rsrc其中&nbsp;edata&nbsp;在优化时可以合并到&nbsp;.idata，最后的&nbsp;.rsrc&nbsp;在&nbsp;dump&nbsp;了资源后可以删除，再载入&nbsp;dump&nbsp;后的资源文件。8、其他在破解中所用到的工具，如果没有的话，请到&nbsp;http://www.pediy.com/tools.htm&nbsp;下载。录像下载地址：http://ccdebugger.wt1.7it7.cn/data/Radialix.2.06.1.1267.Crack.Demo.rar]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::676-1241413737]]></link>
 <author><![CDATA[CCDebuger]]></author>
 <category><![CDATA[汉化脱壳]]></category>
 <pubDate><![CDATA[Mon, 04 May 2009 13:08:57 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[资源区段的重建]]></title>
 <description><![CDATA[我们知道，汉化软件的标准资源其实就是在对资源区段中的资源进行修改，因此，汉化后软件的资源区段一般情况下其的大小都会有一定的改变。正常程序由于资源段在程序的最后，因此其大小的改变一般不会对程序有影响（自校验除外）。而手工脱壳后的程序，其资源区段不一定在最后面，因此程序汉化后就会出错，具体表现就是程序汉化后无法运行或者运行出错。因此，我们对于手工脱壳后的程序，在汉化前首先要确定其资源表的位置，以确定是否需要对程序在汉化前进行预处理。具体我们可以用 eXeScopy 或ResScope 或 PE Explorer 或者 LordPE 来打开程序来查看程序中各个区段的在程序中的位置和大小。具体操作如下：用 eXeScopy 或 ResScope 或 PE Explorer&nbsp; 或者 LordPE 打开要查看的文件，然后在菜单中选择&ldquo;视图&rdquo;&mdash;&mdash;&ldquo;区段头&rdquo;即可查看各区段的相关信息。现在介绍一下不用 FreeRes 0.94（对有些程序不支持！），而只用 FixRes 和 LordPE 重建区段的方法！软件：Radialix 2 中的 rdlc.exe备注：该文件已经 tracky 脱壳并破解，但是最后的区段为 .tracky，无法汉化，需要将 .rsrc 移到最后，而且该文件无法用 FreeRes 0.94 重建资源区段。工具：FixRes 和 LordPE （看雪学院有下载！）， eXeScope 方法：1、打开 LordPE，在 PE 编辑器中载入 rdlc.exe，显示以下信息，记下文件块对齐中的数据：00000200单击区段，显示一下信息：看到了吧，资源 .rsrc 区段在 .tracky 前面。注意 .tracky 区段中的虚拟偏移地址（VOffset）为 00325000，记下它或者选中该区段，单击右键，选择&ldquo;编辑区段&rdquo;菜单，然后复制备用。
2、打开 FixRes，选择 Dump 选项卡，在 NewRVA（即要将 .rsrc 区段移动到新的虚拟偏移地址）输入 00326000（00325000+1000），在FileAlignment（文件块对齐）输入文件块对齐中的数据：00000200（省略前面的0），然后按 Dump Resource（转储资源）按钮，即在指定目录中生成了一个 rsrc.bin 文件。3、再次打开 LordPE，单击区段，并在窗口的任意位置单击右键，选择&ldquo;从磁盘载入段&rdquo;菜单，将上步生成的 rsrc.bin 载入。
看到新增加了一个 rsrc.bin 区段了吧。保存一下，并记下该区段的虚拟偏移地址（VOffset）为 00326000，以及Vsize（虚拟大小）000CA000 备用。4、退出区段对话框，单击&ldquo;区段&rdquo;按钮下面的&ldquo;目录&rdquo;，出现如下对话框：注意上面对话框中的资源旁边RVA和大小框中的数据，将RVA改成 rsrc.bin 段的虚拟偏移地址00326000，大小改成 rsrc.bin 段的虚拟大小 000CA000（大小一般不用改，因为是从相同大小的资源中Dump出来的）。按保存按钮后，单击&ldquo;..&rdquo;按钮，看看资源是否已经可见，并且选择段内某个数据，看看下面偏移框内是否正确（此框内不显示错误即正确，这个比PETools先进！可以马上知道资源正确与否！）。5、退出目录对话框，回到区段对话框，在 .rsrc 区段上单击右键，选择&ldquo;清除区段&rdquo;。再选中新增区段 rsrc.bin，单击右键，选择&ldquo;编辑区段&rdquo;，将区段名改为&ldquo; .rsrc &rdquo;，退出区段对话框，然后单击保存，并关闭 PE 编辑器。 6、此时的文件还无法运行，需要重建一下。再次打开 LordPE，单击&ldquo;重建 PE&rdquo;按钮，载入修改过区段的 rdlc.exe 重建。7、重建后的 rdlc.exe 文件已可正常运行。为了验证一下，我们用 eXeScope 打开 rdlc.exe 文件，看看里面的资源是否正常。这里一切正常！8、至此，大功告成！可以着手汉化了！]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::675-1241250357]]></link>
 <author><![CDATA[wanfu]]></author>
 <category><![CDATA[汉化脱壳]]></category>
 <pubDate><![CDATA[Sat, 02 May 2009 15:45:57 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--7 注意事项]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第七章：注意事项&nbsp; 点击原作者网站在线观看 点击本地下载7.1 字体调整7.2 发布7.3 捆绑插件
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::674-1239187003]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Wed, 08 Apr 2009 18:36:43 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--6.3 简繁转换]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第六章：快速汉化6.1 字典的使用6.2 程序升级6.3 简繁转换&nbsp; 点击原作者网站在线观看 点击本地下载
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::673-1239186844]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Wed, 08 Apr 2009 18:34:04 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--6.2 程序升级]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第六章：快速汉化6.1 字典的使用6.2 程序升级 点击原作者网站在线观看 点击本地下载6.3 简繁转换
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::672-1239186578]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Wed, 08 Apr 2009 18:29:38 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--6.1 字典的使用]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第六章：快速汉化6.1 字典的使用 点击原作者网站在线观看 点击本地下载6.2 程序升级6.3 简繁转换
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::671-1239186277]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Wed, 08 Apr 2009 18:24:37 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--5.3 ASCII和 Unicode 第二部分]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第五章：非标资源汉化5.1 图片图标5.2 ASCII和 Unicode 第一部分5.3 ASCII和 Unicode 第二部分 点击原作者网站在线观看 点击本地下载
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::670-1238337212]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Sun, 29 Mar 2009 22:33:32 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--5.2 ASCII和 Unicode 第一部分]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第五章：非标资源汉化5.1 图片图标5.2 ASCII和 Unicode 第一部分 点击原作者网站在线观看 点击本地下载5.3 ASCII和 Unicode 第二部分
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::669-1238336919]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Sun, 29 Mar 2009 22:28:39 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--5.1 图片图标]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第五章：非标资源汉化5.1 图片图标 点击原作者网站在线观看 点击本地下载5.2 ASCII和 Unicode 第一部分5.3 ASCII和 Unicode 第二部分
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::668-1238336199]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Sun, 29 Mar 2009 22:16:39 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[正则表达式之道]]></title>
 <description><![CDATA[





正则表达式之道

原著：Steve Mansour sman@scruznet.com Revised: June 5, 1999(copied by jm /at/ jmason.org from http://www.scruz.net/%7esman/regexp.htm, after the original disappeared! ) 
翻译：Neo Leeneo.lee@gmail.com2004年10月16日

英文版原文
译者按：原文因为年代久远，文中很多链接早已过期（主要是关于vi、sed等工具的介绍和手册），本译文中已将此类链接删除，如需检查这些链接可以查看上面链接的原文。除此之外基本照原文直译，括号中有&ldquo;译者按&rdquo;的部分是译者补充的说明。如有内容方面的问题请直接和Steve Mansor联系，当然，如果你只写中文，也可以和我联系。

目 录
什么是正则表达式 范例 &nbsp;&nbsp; 简单 &nbsp;&nbsp; 中级（神奇的咒语） &nbsp;&nbsp; 困难（不可思议的象形文字）不同工具中的正则表达式 
&nbsp;

什么是正则表达式
一个正则表达式，就是用某种模式去匹配一类字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用&mdash;&mdash;很不幸，这篇文章也不能够改变这一点，不过，经过一点点练习之后我就开始觉得这些复杂的表达式其实写起来还是相当简单的，而且，一旦你弄懂它们，你就能把数小时辛苦而且易错的文本处理工作压缩在几分钟（甚至几秒钟）内完成。正则表达式被各种文本编辑软件、类库（例如Rogue Wave的tools.h++）、脚本工具（像awk/grep/sed）广泛的支持，而且像Microsoft的Visual C++这种交互式IDE也开始支持它了。
我们将在如下的章节中利用一些例子来解释正则表达式的用法，绝大部分的例子是基于vi中的文本替换命令和grep文件搜索命令来书写的，不过它们都是比较典型的例子，其中的概念可以在sed、awk、perl和其他支持正则表达式的编程语言中使用。你可以看看不同工具中的正则表达式这一节，其中有一些在别的工具中使用正则表达式的例子。还有一个关于vi中文本替换命令（s）的简单说明附在文后供参考。
正则表达式基础
正则表达式由一些普通字符和一些元字符（metacharacters）组成。普通字符包括大小写的字母和数字，而元字符则具有特殊的含义，我们下面会给予解释。
在最简单的情况下，一个正则表达式看上去就是一个普通的查找串。例如，正则表达式&quot;testing&quot;中没有包含任何元字符，，它可以匹配&quot;testing&quot;和&quot;123testing&quot;等字符串，但是不能匹配&quot;Testing&quot;。
要想真正的用好正则表达式，正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。 


    
        
            元字符
            &nbsp;
            描述
        
        
            
            &nbsp;
            
        
        
            . 
            &nbsp;
            匹配任何单个字符。例如正则表达式r.t匹配这些字符串：rat、rut、r t，但是不匹配root。&nbsp;
        
        
            $ 
            &nbsp;
            匹配行结束符。例如正则表达式weasel$ 能够匹配字符串&quot;He's a weasel&quot;的末尾，但是不能匹配字符串&quot;They are a bunch of weasels.&quot;。&nbsp;
        
        
            ^ 
            &nbsp;
            匹配一行的开始。例如正则表达式^When in能够匹配字符串&quot;When in the course of human events&quot;的开始，但是不能匹配&quot;What and When in the&quot;。
        
        
            * 
            &nbsp;
            匹配0或多个正好在它之前的那个字符。例如正则表达式.*意味着能够匹配任意数量的任何字符。
        
        
            \ 
            &nbsp;
            这是引用府，用来将这里列出的这些元字符当作普通的字符来进行匹配。例如正则表达式\$被用来匹配美元符号，而不是行尾，类似的，正则表达式\.用来匹配点字符，而不是任何字符的通配符。
        
        
            [ ]&nbsp; [c1-c2] [^c1-c2] 
            &nbsp;
            匹配括号中的任何一个字符。例如正则表达式r[aou]t匹配rat、rot和rut，但是不匹配ret。可以在括号中使用连字符-来指定字符的区间，例如正则表达式[0-9]可以匹配任何数字字符；还可以制定多个区间，例如正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是&ldquo;排除&rdquo;，要想匹配除了指定区间之外的字符&mdash;&mdash;也就是所谓的补集&mdash;&mdash;在左边的括号和第一个字符之间使用^字符，例如正则表达式[^269A-Z] 将匹配除了2、6、9和所有大写字母之外的任何字符。
        
        
            \&lt; \&gt; 
            &nbsp;
            匹配词（word）的开始（\&lt;）和结束（\&gt;）。例如正则表达式\&lt;the能够匹配字符串&quot;for the wise&quot;中的&quot;the&quot;，但是不能匹配字符串&quot;otherwise&quot;中的&quot;the&quot;。注意：这个元字符不是所有的软件都支持的。
        
        
            \( \) 
            &nbsp;
            将 \( 和 \) 之间的表达式定义为&ldquo;组&rdquo;（group），并且将匹配这个表达式的字符保存到一个临时区域（一个正则表达式中最多可以保存9个），它们可以用 \1 到\9 的符号来引用。
        
        
            | 
            &nbsp;
            将两个匹配条件进行逻辑&ldquo;或&rdquo;（Or）运算。例如正则表达式(him|her) 匹配&quot;it belongs to him&quot;和&quot;it belongs to her&quot;，但是不能匹配&quot;it belongs to them.&quot;。注意：这个元字符不是所有的软件都支持的。
        
        
            + 
            &nbsp;
            匹配1或多个正好在它之前的那个字符。例如正则表达式9+匹配9、99、999等。注意：这个元字符不是所有的软件都支持的。
        
        
            ? 
            &nbsp;
            匹配0或1个正好在它之前的那个字符。注意：这个元字符不是所有的软件都支持的。
        
        
            \{i\} \{i,j\} 
            &nbsp;
            匹配指定数目的字符，这些字符是在它之前的表达式定义的。例如正则表达式A[0-9]\{3\} 能够匹配字符&quot;A&quot;后面跟着正好3个数字字符的串，例如A123、A348等，但是不匹配A1234。而正则表达式[0-9]\{4,6\} 匹配连续的任意4个、5个或者6个数字字符。注意：这个元字符不是所有的软件都支持的。
        
    


&nbsp;

最简单的元字符是点，它能够匹配任何单个字符（注意不包括新行符）。假定有个文件test.txt包含以下几行内容：
he is a rathe is in a rutthe food is RottenI like root beer 
    我们可以使用grep命令来测试我们的正则表达式，grep命令使用正则表达式去尝试匹配指定文件的每一行，并将至少有一处匹配表达式的所有行显示出来。命令
    grep r.t test.txt 
        在test.txt文件中的每一行中搜索正则表达式r.t，并打印输出匹配的行。正则表达式r.t匹配一个r接着任何一个字符再接着一个t。所以它将匹配文件中的rat和rut，而不能匹配Rotten中的Rot，因为正则表达式是大小写敏感的。要想同时匹配大写和小写字母，应该使用字符区间元字符（方括号）。正则表达式[Rr]能够同时匹配R和r。所以，要想匹配一个大写或者小写的r接着任何一个字符再接着一个t就要使用这个表达式：[Rr].t。
        要想匹配行首的字符要使用抑扬字符（^）&mdash;&mdash;又是也被叫做插入符。例如，想找到text.txt中行首&quot;he&quot;打头的行，你可能会先用简单表达式he，但是这会匹配第三行的the，所以要使用正则表达式^he，它只匹配在行首出现的h。 
        有时候指定&ldquo;除了&times;&times;&times;都匹配&rdquo;会比较容易达到目的，当抑扬字符（^）出现在方括号中是，它表示&ldquo;排除&rdquo;，例如要匹配he ，但是排除前面是t or s的情性（也就是the和she），可以使用：[^st]he。 
        可以使用方括号来指定多个字符区间。例如正则表达式[A-Za-z]匹配任何字母，包括大写和小写的；正则表达式[A-Za-z][A-Za-z]* 匹配一个字母后面接着0或者多个字母（大写或者小写）。当然我们也可以用元字符+做到同样的事情，也就是：[A-Za-z]+ ，和[A-Za-z][A-Za-z]*完全等价。但是要注意元字符+ 并不是所有支持正则表达式的程序都支持的。关于这一点可以参考后面的正则表达式语法支持情况。
        要指定特定数量的匹配，要使用大括号（注意必须使用反斜杠来转义）。想匹配所有100和1000的实例而排除10和10000，可以使用：10\{2,3\}，这个正则表达式匹配数字1后面跟着2或者3个0的模式。在这个元字符的使用中一个有用的变化是忽略第二个数字，例如正则表达式0\{3,\} 将匹配至少3个连续的0。
        简单的例子
        这里有一些有代表性的、比较简单的例子。 
        
        
            
                
                    vi 命令
                    作用
                
                
                    
                    
                
                
                    :%s/ */ /g
                    把一个或者多个空格替换为一个空格。
                
                
                    :%s/ *$//
                    去掉行尾的所有空格。
                
                
                    :%s/^/ /
                    在每一行头上加入一个空格。
                
                
                    :%s/^[0-9][0-9]* //
                    去掉行首的所有数字字符。
                
                
                    :%s/b[aeio]g/bug/g
                    将所有的bag、beg、big和bog改为bug。&nbsp;
                
                
                    :%s/t\([aou]\)g/h\1t/g
                    将所有tag、tog和tug分别改为hat、hot和hug（注意用group的用法和使用\1引用前面被匹配的字符）。
                
                
                    &nbsp;
                    &nbsp;
                
            
        
        
        中级的例子（神奇的咒语）
        例1
        将所有方法foo(a,b,c)的实例改为foo(b,a,c)。这里a、b和c可以是任何提供给方法foo()的参数。也就是说我们要实现这样的转换： 
        
        
            
                
                    之前
                    &nbsp;
                    之后
                
                
                    foo(10,7,2)
                    &nbsp;
                    foo(7,10,2)
                
                
                    foo(x+13,y-2,10)
                    &nbsp;
                    foo(y-2,x+13,10)
                
                
                    foo( bar(8), x+y+z, 5)
                    &nbsp;
                    foo( x+y+z, bar(8), 5)
                
            
        
        
        下面这条替换命令能够实现这一魔法：
        :%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g 
            现在让我们把它打散来加以分析。写出这个表达式的基本思路是找出foo()和它的括号中的三个参数的位置。第一个参数是用这个表达式来识别的：：\([^,]*\)，我们可以从里向外来分析它：&nbsp; 
            
            
                
                    
                        [^,]
                        &nbsp;
                        除了逗号之外的任何字符
                    
                    
                        [^,]*
                        &nbsp;
                        0或者多个非逗号字符
                    
                    
                        \([^,]*\)
                        &nbsp;
                        将这些非逗号字符标记为\1，这样可以在之后的替换模式表达式中引用它
                    
                    
                        \([^,]*\),
                        &nbsp;
                        我们必须找到0或者多个非逗号字符后面跟着一个逗号，并且非逗号字符那部分要标记出来以备后用。
                    
                
            
            
            现在正是指出一个使用正则表达式常见错误的最佳时机。为什么我们要使用[^,]*这样的一个表达式，而不是更加简单直接的写法，例如：.*，来匹配第一个参数呢？设想我们使用模式.*来匹配字符串&quot;10,7,2&quot;，它应该匹配&quot;10,&quot;还是&quot;10,7,&quot;？为了解决这个两义性（ambiguity），正则表达式规定一律按照最长的串来，在上面的例子中就是&quot;10,7,&quot;，显然这样就找出了两个参数而不是我们期望的一个。所以，我们要使用[^,]*来强制取出第一个逗号之前的部分。
            这个表达式我们已经分析到了：foo(\([^,]*\)，这一段可以简单的翻译为&ldquo;当你找到foo(就把其后直到第一个逗号之前的部分标记为\1&rdquo;。然后我们使用同样的办法标记第二个参数为\2。对第三个参数的标记方法也是一样，只是我们要搜索所有的字符直到右括号。我们并没有必要去搜索第三个参数，因为我们不需要调整它的位置，但是这样的模式能够保证我们只去替换那些有三个参数的foo()方法调用，在foo()是一个重载（overoading）方法时这种明确的模式往往是比较保险的。然后，在替换部分，我们找到foo()的对应实例，然后利用标记好的部分进行替换，是的第一和第二个参数交换位置。
            例2
            假设有一个CSV（comma separated value）文件，里面有一些我们需要的信息，但是格式却有问题，目前数据的列顺序是：姓名，公司名，州名缩写，邮政编码，现在我们希望讲这些数据重新组织，以便在我们的某个软件中使用，需要的格式为：姓名，州名缩写-邮政编码，公司名。也就是说，我们要调整列顺序，还要合并两个列来构成一个新列。另外，我们的软件不能接受逗号前后面有任何空格（包括空格和制表符）所以我们还必须要去掉逗号前后的所有空格。
            这里有几行我们现在的数据：
            Bill Jones,&nbsp;&nbsp;&nbsp;&nbsp; HI-TEK Corporation ,&nbsp; CA, 95011 Sharon Lee Smith,&nbsp; Design Works Incorporated,&nbsp; CA, 95012 B. Amos&nbsp;&nbsp; ,&nbsp; Hill Street Cafe,&nbsp; CA, 95013 Alexander Weatherworth,&nbsp; The Crafts Store,&nbsp; CA, 95014 ... 
                我们希望把它变成这个样子：
                Bill Jones,CA 95011,HI-TEK Corporation Sharon Lee Smith,CA 95012,Design Works Incorporated B. Amos,CA 95013,Hill Street Cafe Alexander Weatherworth,CA 95014,The Crafts Store ... 
                    我们将用两个正则表达式来解决这个问题。第一个移动列和合并列，第二个用来去掉空格。
                    下面就是第一个替换命令：
                    :%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3 \4,\2/ 
                        这里的方法跟例1基本一样，第一个列（姓名）用这个表达式来匹配：\([^,]*\)，即第一个逗号之前的所有字符，而姓名内容被用\1标记下来。公司名和州名缩写字段用同样的方法标记为\2和\3，而最后一个字段用\(.*\)来匹配（&quot;匹配所有字符直到行末&quot;）。替换部分则引用上面标记的那些内容来进行构造。
                        下面这个替换命令则用来去除空格：
                        :%s/[ \t]*,[ \t]*/,/g 
                            我们还是分解来看：[ \t]匹配空格/制表符，[ \t]* 匹配0或多个空格/制表符，[ \t]*,匹配0或多个空格/制表符后面再加一个逗号，最后，[ \t]*,[ \t]*匹配0或多个空格/制表符接着一个逗号再接着0或多个空格/制表符。在替换部分，我们简单的我们找到的所有东西替换成一个逗号。这里我们使用了结尾的可选的g参数，这表示在每行中对所有匹配的串执行替换（而不是缺省的只替换第一个匹配串）。
                            例3
                            假设有一个多字符的片断重复出现，例如： Billy tried really hard Sally tried really really hard Timmy tried really really really hard Johnny tried really really really really hard而你想把&quot;really&quot;、&quot;really really&quot;，以及任意数量连续出现的&quot;really&quot;字符串换成一个简单的&quot;very&quot;（simple is good!），那么以下命令： :%s/\(really \)\(really \)*/very /就会把上述的文本变成： Billy tried very hard Sally tried very hard Timmy tried very hard Johnny tried very hard表达式\(really \)*匹配0或多个连续的&quot;really &quot;（注意结尾有个空格），而\(really \)\(really \)* 匹配1个或多个连续的&quot;really &quot;实例。
                            困难的例子（不可思议的象形文字）
                            Coming soon.
                            &nbsp;
                            
                            不同工具中的正则表达式
                            OK，你已经准备使用RE（regular expressions，正则表达式），但是你并准备使用vi。所以，在这里我们给出一些在其他工具中使用RE的例子。另外，我还会总结一下你在不同程序之间使用RE可能发现的区别。
                            当然，你也可以在Visual C++编辑器中使用RE。选择Edit-&gt;Replace，然后选择&quot;Regular expression&quot;选择框，Find What输入框对应上面介绍的vi命令:%s/pat1/pat2/g中的pat1部分，而Replace输入框对应pat2部分。但是，为了得到vi的执行范围和g选项，你要使用Replace All或者适当的手工Find Next and Replace（译者按：知道为啥有人骂微软弱智了吧，虽然VC中可以选中一个范围的文本，然后在其中执行替换，但是总之不够vi那么灵活和典雅）。
                            sed
                            Sed是Stream EDitor的缩写，是Unix下常用的基于文件和管道的编辑工具，可以在手册中得到关于sed的详细信息。 
                            这里是一些有趣的sed脚本，假定我们正在处理一个叫做price.txt的文件。注意这些编辑并不会改变源文件，sed只是处理源文件的每一行并把结果显示在标准输出中（当然很容易使用重定向来定制）： 
                            
                            
                                
                                    
                                        sed脚本
                                        &nbsp;
                                        描述
                                    
                                    
                                        
                                        &nbsp;
                                        
                                    
                                    
                                        sed 's/^$/d' price.txt
                                        &nbsp;
                                        删除所有空行
                                    
                                    
                                        sed 's/^[ \t]*$/d' price.txt
                                        &nbsp;
                                        删除所有只包含空格或者制表符的行
                                    
                                    
                                        sed 's/&quot;//g' price.txt
                                        &nbsp;
                                        删除所有引号
                                    
                                
                            
                            
                            awk
                            awk是一种编程语言，可以用来对文本数据进行复杂的分析和处理。可以在手册中得到关于awk的详细信息。这个古怪的名字是它作者们的姓的缩写（Aho，Weinberger和Kernighan）。
                            在Aho，Weinberger和Kernighan的书The AWK Programming Language中有很多很好的awk的例子，请不要让下面这些微不足道的脚本例子限制你对awk强大能力的理解。我们同样假定我们针对price.txt文件进行处理，跟sed一样，awk也只是把结果显示在终端上。&nbsp; 
                            
                            
                                
                                    
                                        awk脚本
                                        &nbsp;
                                        描述
                                    
                                    
                                        
                                        &nbsp;
                                        
                                    
                                    
                                        awk '$0 !~ /^$/' price.txt
                                        &nbsp;
                                        删除所有空行
                                    
                                    
                                        awk 'NF &gt; 0' price.txt
                                        &nbsp;
                                        awk中一个更好的删除所有行的办法
                                    
                                    
                                        awk '$2 ~ /^[JT]/ {print $3}' price.txt
                                        &nbsp;
                                        打印所有第二个字段是'J'或者'T'打头的行中的第三个字段
                                    
                                    
                                        awk '$2 !~ /[Mm]isc/ {print $3 + $4}' price.txt
                                        &nbsp;
                                        针对所有第二个字段不包含'Misc'或者'misc'的行，打印第3和第4列的和（假定为数字）
                                    
                                    
                                        awk '$3 !~ /^[0-9]+\.[0-9]*$/ {print $0}' price.txt
                                        &nbsp;
                                        打印所有第三个字段不是数字的行，这里数字是指d.d或者d这样的形式，其中d是0到9的任何数字
                                    
                                    
                                        awk '$2 ~ /John|Fred/ {print $0}' price.txt
                                        &nbsp;
                                        如果第二个字段包含'John'或者'Fred'则打印整行
                                    
                                
                            
                            
                            grep
                            grep是一个用来在一个或者多个文件或者输入流中使用RE进行查找的程序。它的name编程语言可以用来针对文件和管道进行处理。可以在手册中得到关于grep的完整信息。这个同样古怪的名字来源于vi的一个命令，g/re/p，意思是global regular expression print。
                            下面的例子中我们假定在文件phone.txt中包含以下的文本，&mdash;&mdash;其格式是姓加一个逗号，然后是名，然后是一个制表符，然后是电话号码：
                            
                                Francis, John&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5-3871 Wong, Fred&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4-4123 Jones, Thomas&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1-4122 Salazar, Richard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5-2522
                            
                            
                            
                                
                                    
                                        grep命令
                                        &nbsp;
                                        描述
                                    
                                    
                                        
                                        &nbsp;
                                        
                                    
                                    
                                        grep '\t5-...1' phone.txt
                                        &nbsp;
                                        把所有电话号码以5开头以1结束的行打印出来，注意制表符是用\t表示的
                                    
                                    
                                        grep '^S[^ ]* R' phone.txt
                                        &nbsp;
                                        打印所有姓以S打头和名以R打头的行
                                    
                                    
                                        grep '^[JW]' phone.txt
                                        &nbsp;
                                        打印所有姓开头是J或者W的行
                                    
                                    
                                        grep ', ....\t' phone.txt
                                        &nbsp;
                                        打印所有姓是4个字符的行，注意制表符是用\t表示的
                                    
                                    
                                        grep -v '^[JW]' phone.txt
                                        &nbsp;
                                        打印所有不以J或者W开头的行
                                    
                                    
                                        grep '^[M-Z]' phone.txt
                                        &nbsp;
                                        打印所有姓的开头是M到Z之间任一字符的行
                                    
                                    
                                        grep '^[M-Z].*[12]' phone.txt
                                        &nbsp;
                                        打印所有姓的开头是M到Z之间任一字符，并且点号号码结尾是1或者2的行
                                    
                                
                            
                            
                            egrep
                            egrep是grep的一个扩展版本，它在它的正则表达式中支持更多的元字符。下面的例子中我们假定在文件phone.txt中包含以下的文本，&mdash;&mdash;其格式是姓加一个逗号，然后是名，然后是一个制表符，然后是电话号码：
                            Francis, John&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5-3871 Wong, Fred&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4-4123 Jones, Thomas&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1-4122 Salazar, Richard&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5-2522 
                                
                                
                                    
                                        
                                            egrep command
                                            &nbsp;
                                            Description
                                        
                                        
                                            
                                            &nbsp;
                                            
                                        
                                        
                                            egrep '(John|Fred)' phone.txt
                                            &nbsp;
                                            打印所有包含名字John或者Fred的行
                                        
                                        
                                            egrep 'John|22$|^W' phone.txt
                                            &nbsp;
                                            打印所有包含John 或者以22结束或者以W的行
                                        
                                        
                                            egrep 'net(work)?s' report.txt
                                            &nbsp;
                                            从report.txt中找到所有包含networks或者nets的行
                                        
                                    
                                
                                
                                
                                正则表达式语法支持情况
                                
                                    
                                        
                                            命令或环境
                                            .
                                            [ ]
                                            ^
                                            $
                                            \( \)
                                            \{ \}
                                            ?
                                            +
                                            |
                                            ( )
                                        
                                        
                                            vi
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                        
                                        
                                            Visual C++
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                        
                                        
                                            awk
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                        
                                        
                                            sed
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                        
                                        
                                            Tcl
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                        
                                        
                                            ex
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                        
                                        
                                            grep
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                        
                                        
                                            egrep
                                            &nbsp;X&nbsp;
                                            &nbsp;X
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                        
                                        
                                            fgrep
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;X&nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                            &nbsp;
                                        
                                        
                                            perl
                                            &nbsp;X
                                            &nbsp;X
                                            &nbsp;X
                                            &nbsp;X
                                            &nbsp;X
                                            &nbsp;
                                            &nbsp;X
                                            &nbsp;X
                                            &nbsp;X
                                            &nbsp;X
                                        
                                    
                                
                                &nbsp;
                                
                                vi替换命令简介
                                Vi的替换命令：
                                :ranges/pat1/pat2/g 
                                    其中
                                    : 这是Vi的命令执行界面。 
                                        range 是命令执行范围的指定，可以使用百分号（%）表示所有行，使用点（.）表示当前行，使用美元符号（$）表示最后一行。你还可以使用行号，例如10,20表示第10到20行，.,$表示当前行到最后一行，.+2,$-5表示当前行后两行直到全文的倒数第五行，等等。
                                            s 表示其后是一个替换命令。
                                            pat1 这是要查找的一个正则表达式，这篇文章中有一大堆例子。
                                        
                                        pat2 这是希望把匹配串变成的模式的正则表达式，这篇文章中有一大堆例子。
                                            g 可选标志，带这个标志表示替换将针对行中每个匹配的串进行，否则则只替换行中第一个匹配串。
                                        
                                        网上有很多vi的在线手册，你可以访问他们以获得更加完整的信息。
                                        &nbsp;
                                        
                                        [回到主页]
                                        ]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::667-1236932268]]></link>
 <author><![CDATA[Neo Lee]]></author>
 <category><![CDATA[系统教学]]></category>
 <pubDate><![CDATA[Fri, 13 Mar 2009 16:17:48 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--4.1 语言文件]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第四章：其它类型程序汉化4.1 语言文件&nbsp;&nbsp; 点击原作者网站在线观看 点击本地下载4.2 VB 程序 并入第五章讲解4.3 掌上汉化 缺少测试环境暂不讲解，等有了硬件环境再讲解！
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::666-1236597827]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Mon, 09 Mar 2009 19:23:47 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--3.3 操作技巧]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第三章：汉化 Delphi 程序3.1 Sisulizer 介绍3.2 Delphi 程序汉化实例3.3 操作技巧&nbsp; 点击原作者网站在线观看 点击本地下载
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::665-1236597421]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Mon, 09 Mar 2009 19:17:01 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[Athena-A 挪移功能的详细用法]]></title>
 <description><![CDATA[对于 Athena-A 是做什么的，如何建立工程，就不再罗嗦了，说一说字符串挪移功能。首先说说挪移的原理：要翻译的字符串所在地址在程序中至少有一个地方调用，也可能是多处调用。Athena-A 首先找出这些调用的地址，然后把字符串放在一个新的地方，并把新的地址赋值给那些调用地址。下面以汉化 GoldWave 的非标字符串为例子加以说明：通常情况下一句英文句子翻译成中文后，往往中文要比英文语句短，如下图所示：我们记下这个英文句子的地址：0024B215选中超长，点击红色&lsquo;挪移&rsquo;按钮进行过滤，过滤出需要挪移的翻译。我们就来挪移 Cut&lsquo;剪切&rsquo;这个字符串。这里有两种方法来处理&lsquo;剪切&rsquo;字符串，首先鼠标双击 &lsquo;00248624 Cut 剪切&rsquo;这一行，这样展开整个字符串列表，如下图：看到紧跟 &lsquo;Cut 剪切&rsquo;下面的&lsquo;Paste 粘贴&rsquo;了吗？中文要比英文短一个字母的空间，那么我们就向后挪移&lsquo;Paste 粘贴&rsquo;一个空间，而腾给&lsquo;Cut 剪切&rsquo;来使用，这时不只是向后挪移&lsquo;Paste 粘贴&rsquo;，还要设置&lsquo;Cut 剪切&rsquo;为超写，这样才能超长写入。如图四、图五所示，填入移动长度：1，点击检索，检索出调用地址是 002481CC ，看来只有一个调用地址，如果是多个调用地址而只留一个地址，在这里可以选择不需要的调用地址然后点击键盘上的 Del 键删除。按下 Ctrl 键不放然后点选则可以选择多个调用地址。设定好后点击应用。点击确定退出，然后再鼠标右击&lsquo;Paste 粘贴&rsquo;，只有后移被标识了，其它的挪移选项不能用了，这表明后移设定成功。我们先来看看单独翻译&lsquo;Paste 粘贴&rsquo;后的效果图：也就是说&lsquo;Paste&rsquo;原来是在 00248628 位置，而向后挪移后&lsquo;粘贴&rsquo;在 00248629 这个位置。我们再来看看调用此字符串的数据的改变。你还记得前面设置后移时见到的 002481CC 这个地址吗？我们看看这个地址有什么变化：哦，原来 002481CC 处的数据 28 9E 64 00 变成了 29 9E 64 00 ，那么 28 9E 64 00 又是什么呢？它和 &lsquo;Paste 粘贴&rsquo;所在地址 00248628 又有什么关系呢？我们先把 28 9E 64 00 顺序倒过来，变成 00649E28 ，并复制 00649E28 。然后打开 Athena-A 工具中的地址计算工具，点击虚拟地址，再点击粘贴按钮粘贴 00649E28 ，点击计算，看到了什么？计算结果居然是 00248628 ，也就是&lsquo;Paste&rsquo;所在的物理偏移地址。手工挪移就是这样挪移的，只是 Athena-A 把它自动化了，不用手工来把自己搞得晕头转向。下图是实际软件运行效果，确实是被正确挪移了。接下来设置&lsquo;Cut&rsquo;为超写就可以了。下图是实际完成图：接下来说说另一种处理&lsquo;Cut 剪切&rsquo;的方法。取消&lsquo;Paste 粘贴&rsquo;后移，取消&lsquo;Cut 剪切&rsquo;超写。然后鼠标右击点击迁移，如图：点击检索，你还记得在开头让你记下的地址 0024B215 吗？在可用地址列表中找到它，然后双击 0024B215 ，点击应用就设定好挪移了。是不是很容易呢？原理与前面讲的后移一样，只不过挪到了翻译后 0024B215 空闲出来的那个地方。如何手工挪移字符串对于汉化初学者来说还是很有必要学习一下，你只有懂得了这些基本原理才有能力去处理一些复杂而工具也无法完成的任务。接下来说说矩阵功能。意思就是把多个需要挪移的字符串集中挪到一个指定的区域当中。我们先找个空白处，就在结尾处吧，好找，如下图：就是 0031FEE0 到 0031FFFF 这个范围了。添加 0031FEE0 为开始地址，长度 287，这个长度需要你计算。点击检索，点击应用就设定好了，就这么简单。]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::664-1236481595]]></link>
 <author><![CDATA[海子]]></author>
 <category><![CDATA[工具使用]]></category>
 <pubDate><![CDATA[Sun, 08 Mar 2009 11:06:35 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--3.2 Delphi 程序汉化实例]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第三章：汉化 Delphi 程序3.1 Sisulizer 介绍3.2 Delphi 程序汉化实例&nbsp; 点击原作者网站在线观看 点击本地下载3.3 操作技巧
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::663-1236132743]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Wed, 04 Mar 2009 10:12:23 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--3.1 Sisulizer 介绍]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第三章：汉化 Delphi 程序3.1 Sisulizer 介绍 点击原作者网站在线观看 点击本地下载3.2 Delphi 程序汉化实例3.3 操作技巧
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::662-1236131607]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Wed, 04 Mar 2009 09:53:27 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--2.3 操作技巧]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第二章：汉化 VC 程序2.1 PASSOLO 介绍2.2 VC 程序汉化实例2.3 操作技巧 点击原作者网站在线观看 点击本地下载
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::661-1236131448]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Wed, 04 Mar 2009 09:50:48 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--2.2 VC 程序汉化实例]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第二章：汉化 VC 程序2.1 PASSOLO 介绍2.2 VC 程序汉化实例 点击原作者网站在线观看 点击本地下载2.3 操作技巧
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::660-1236131189]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Wed, 04 Mar 2009 09:46:29 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--2.1 PASSOLO 介绍]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/
注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。
教程目录：
第二章：汉化 VC 程序2.1 PASSOLO 介绍 点击原作者网站在线观看 点击本地下载2.2 VC 程序汉化实例2.3 操作技巧
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::659-1236130248]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Wed, 04 Mar 2009 09:30:48 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[Microsoft 简体中文本地化规范]]></title>
 <description><![CDATA[Microsoft Language Excellence
Simplified Chinese Style Guide
Version 1.0
最近更新: 2008.3
本文的制订旨在给所有从事微软产品本地化工作的人员提供统一的本地化规范，使大家在实际工作中有共同标准可以遵循。 
本规范包括微软本地化通用规范及专用规范，其中专业规范中包含了软件，联机帮助文档，手册以及录音规范。
简体中文的本地化规范一直在不断更新和改进中，在适当的时候我们会增加或修改其中的内容，并不断完善，更新内容我们会放在&ldquo;最近更新&rdquo;章节，请您参考。
我们欢迎您发送意见或建议,请发送到这里。 
注：本文档仅适用于微软本地化产品使用，微软保留针对此文档所有内容的解释权。仅供参考。
摘自 Microsoft 简体中文本地化规范，具体文件请自行下载：Microsoft 简体中文本地化规范更多规范文件，请参阅：http://www.microsoft.com/language/zh/cn/download.mspx]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::657-1234415354]]></link>
 <author><![CDATA[]]></author>
 <category><![CDATA[汉化教学]]></category>
 <pubDate><![CDATA[Thu, 12 Feb 2009 13:09:14 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--1.3 汉化工具]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。教程目录：序言 第一章：基础篇1.1 初识汉化 1.2 资源识别 1.3 汉化工具 点击原作者网站在线观看 点击本地下载
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::656-1233565488]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Mon, 02 Feb 2009 17:04:48 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--1.2 资源识别]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。教程目录：第一章：基础篇1.1 初识汉化 1.2 资源识别 点击原作者网站在线观看 点击本地下载1.3 汉化工具
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::655-1233565023]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Mon, 02 Feb 2009 16:57:03 +0800]]></pubDate>
</item>
<item>
 <title><![CDATA[视频教程：全民汉化--1.1 初识汉化]]></title>
 <description><![CDATA[作者：pcfinal（黑色开裆裤）web：http://www.pc0317.com/bbs/注意：视频分辨率为1024X768，推荐是用屏幕分辨率为1024X768或更高分辨率观看，如速度较慢，请使用下载工具下载后观看。教程目录：第一章：基础篇1.1 初识汉化 点击原作者网站在线观看 点击本地下载1.2 资源识别1.3 汉化工具
]]></description>
 <link><![CDATA[http://www.hanzify.org/teach/index.php?Go=Show::654-1233564442]]></link>
 <author><![CDATA[黑色开裆裤]]></author>
 <category><![CDATA[视频教学]]></category>
 <pubDate><![CDATA[Mon, 02 Feb 2009 16:47:22 +0800]]></pubDate>
</item>
</channel>
</rss>