现在写比较正规的程序的时候,是不是都要支持UNICODE了?另外,还有一个关于代码风格的问题……

sjdf 2004-03-24 03:27:59
1.现在写比较正规的程序,是不是一般都要支持unicode?在unicode下,如果想用字节数组的话,是不是要用BYTE来定义了?

2.虽然const TCHAR * 和 LPCTSTR意义是一样的,但是在写程序的时候,用哪一个比较好些?还是无所谓?msdn里面都是用的LP……这种类型的,是否有必要和它一致?

3.msdn里面对LPSTR和PSTR的描述是一样的,他们有什么区别?还是16位程序遗留下来的历史问题?在win32平台,是不是用哪一种都一样?还是一般用前面带L的?

谢谢!
...全文
79 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mosing 2004-03-25
  • 打赏
  • 举报
回复
另:当资源编译器对所有资源进行编译时,输出文件中的字符串值总是Unicode字符串。在Windows 98和Windows 2000下,如果应用程序没有定义UNICODE宏,那么系统就会进行内部转换。
mosing 2004-03-25
  • 打赏
  • 举报
回复
将应用程序转换为符和Unicode的应用程序应该遵循的一些基本原则:
.将文本串视为字符数组,而不是char数组或字节数组。
.将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。
.将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。
.将TEXT宏用于原意字符和字符串。
.执行全局性替换(例如用PTSTR替换PSTR)。
.修改字符串运算问题。例如传递一个缓存大小是应该传递sizeof(szBuffer)/sizeof(TCHAR),而不是sizeof(szBuffer)。为字符串分配一个缓存应该调用malloc(nCharacters * sizeof(TCHAR)),而不是malloc(nCharacters)。如果操作错误,编译器将不发出警告。


需要注意的问题:
.Windows 2000及支持Unicode,也支持ANSI。
.Windows 98只支持Unicode。
.Windows CE只支持Unicode。
.需要字符串的所有COM接口方法都只能接受Unicode字符串。
.UNICODE宏用于Windows头文件,_UNICODE宏用于C运行期头文件。当编译源代码模块时,通常必须同时定义这两个宏。


两个宏(UNICODE与_UNICODE)的含义:
_UNICODE:
#ifdef _UNICODE
typedef wchar_t TCHAR /* typedef unsigned short wchar_t */
...
#else
typedef char TCHAR
...
#endif // !UNICODE

UNICODE:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW /* 接受Unicode字符串参数 */
#else
#define CreateWindowEx CreateWindowExA /* 接受ANSI字符串参数 */
#endif // !UNICODE
...


Shortcuts:
.C运行库中,所有的Unicode函数均以wcs开头。若要调用Unicode函数,只需用前缀wcs来取代ANSI字符串函数的前缀str即可。
.Windows提供了一组范围很广的字符串操作函数(如StrCat、StrChr、StrCmp、StrCpy等,需包含ShlWApi.h。并且这些函数有ANSI和Unicode两个版本,如StrCatA和StrCatW。所以需要考虑UNICODE宏)。操作系统的许多组件都使用这些函数,而不使用C运行期库。建议最好使用操作系统函数,而不要使用C运行期字符串函数。这件有助于稍稍提高应用程序的运行性能,一位操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe.所使用。用于这些函数使用的很多,因此,在你的应用程序运行时,它们可能已经被装入RAM。
.Microsoft的C运行期的printf函数家族可以对ANSI和Unicode字符和字符串进行混合和匹配。
例如:
char szA[100];
WCHAR szW[100];

// Cover Unicode string to ANSI
sprintf(szA, "%s", L"Unicode Str");
// Cover ANSI strings to Unicode
sprintf(szW, L"%s", "ANSI Str");
.在Unicode与ANSI之间转换字符串的Windows函数
int MultByteToWideChar(
UINT uCodePage,
DWORD dwFlags,
PCSTR pMultiByteStr,
int cchMultiByte,
PWSTR pWideCharStr,
int cchWideChar);

int WideCharToMultiByte(
UINT uCodePage,
DWORD dwFlags,
PCWSTR pWideCharStr,
int cchWideChar,
PSTR pMultiByteStr,
int cchMultByte,
PCSTR pDefaultChar,
PBOOL pfUseDefaultChar);

.Unicode Home Page: http://www.Unicode.org
QunKangLi 2004-03-25
  • 打赏
  • 举报
回复
字符串常量用_T宏定义,如:_T("TEXT");
字符串操作时,将str前缀换为_tcs,如:_tcscpy等价于未定义UNICODE时的strcpy或定义了UNICODE时的mcscpy
字符长度用sizeof(TCHAR)计算,不能依据字串的长度.
sjdf 2004-03-25
  • 打赏
  • 举报
回复
还有一个问题!大家工作时候写的程序,就是正式的那种,代码里面的注释一般用英文还是中文?有什么讲究没有?
《C++编码规范》这本书哪里有下载??
谢谢!
mosing 2004-03-25
  • 打赏
  • 举报
回复
Sorry,打错了。
更正如下:
.Windows 2000及支持Unicode,也支持ANSI。
.Windows 98只支持ANSI。
.Windows CE只支持Unicode。
fengge8ylf 2004-03-25
  • 打赏
  • 举报
回复
hao
Ah 2004-03-25
  • 打赏
  • 举报
回复
To mosing(RMBor$$$):
windows 9x/me 好象都不支持Unicode吧?只支持ANSI
enoloo 2004-03-25
  • 打赏
  • 举报
回复
to mosing(RMBor$$$) ,
.Windows 98只支持Unicode。
.Windows CE只支持Unicode。
在Windows 98和Windows 2000下,如果应用程序没有定义UNICODE宏,那么系统就会进行内部转换。
??
WvW 2004-03-24
  • 打赏
  • 举报
回复
好贴子, 我正想问这种问题
vcforever 2004-03-24
  • 打赏
  • 举报
回复
1、建议在程序中使用 Unicode ,windows2000是用Unicode重新写的!其中的API函数都有ANSI和UNICODE两个版本!如果你在应用程序中使用ANSI字符集,在调用系统API函数之后,会先把ANSI字符转换成UNICODE字符,然后在传递给系统函数,所以从某种意义上将,如果在应用程序中使用了Unicode字符集,可以提高程序的运行效率!
2、建议使用LPCTSTR,因为这是windows定义的数据类型,调用的时候可以省去中间的一些转换步骤!
3、前一个是字符串的长指针,后面是一般指针,确实的16位操作系统遗留下来的,在win32中一般都使用前一种方式
bluebohe 2004-03-24
  • 打赏
  • 举报
回复
放时候-->方式后

MFC程序使用_UNICODE方式编译后,就不能在9X上运行了。
你只要注意把所有的字符串字符定义都采用T的方式就行了TCHAR LPTSTR _T("asd");

不使用_UNICODE方式编译,仅仅使用WCHAR*来表示UNICODE字符串的方式做程序也是可以的,这样的话可以在98下运行
远古猛犸象 2004-03-24
  • 打赏
  • 举报
回复
1.字符串都要加_T宏
2.字符操作函数全部更改为TChar.h里的宏定义
3.sizeof(XXX)变成sizeof(XXX)/sizeof(TCHAR)

还有什么?大家讨论讨论。
bluebohe 2004-03-24
  • 打赏
  • 举报
回复
看你自己需求,如果需要在多个语言版本下运行并且不在98下运行的话,建议使用UNICODE,
为了自己的程序的移植方便,尽量使用带T的定义,比如TCHAR LPTSTR _T""等等,这些定义可以在改动编译放时候不改变源代码即可完成。
2:无所谓
3:现在一般用LPSTR就好了,这些问题都是为了可移植性
sjdf 2004-03-24
  • 打赏
  • 举报
回复
谢谢!
将以前的代码转换到unicode的时候,应该注意点什么?会不会到了9x上就不能正常运行了?
QunKangLi 2004-03-24
  • 打赏
  • 举报
回复
1.UNICODE是WIN2K及更高版本的操作系统内核用的,程序也用UNICODE的话,就不会在每个API函数时先进行一次默认的格式转换,可以提高效率.与字节相关的数据,用BYTE,WORD,DWORD是最佳选择.
2.前后一致就行.L=long,C=const,P=point,T=Text
3.正确,是16位时的历史问题,L表示长指针.32位下是一样的.
TinyXML是一个简单小巧,可以很容易集成到其它程序中的C++ XML解析器。 它能做些什么 简单地说,TinyXML解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM)。 XML的意思是“可扩展标记语言“(eXtensible Markup Language)。它允许你创建你自己的文档标记。在为浏览器标记文档方面HTML做得很好,然而XML允许你定义任何文档标记,比如可以为一个组织者应用程序定义一个描述“to do”列表的文档。 XML拥有一个结构化并且方便的格式,所有为存储应用程序数据而创建的随机文件格式都可以用XML代替,而这一切只需要一个解析器。 最全面正确的说明可以在http://www.w3.org/TR/2004/REC-xml-20040204/找到,但坦白地说,它很晦涩难懂。事实上我喜欢http://skew.org/xml/tutorial上关于XML的介绍。 有不同的方法可以访问和与XML数据进行交互。TinyXML使用文档对象模型(DOM),这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它到磁盘或者另一个输出流中。 TinyXML被设计得容易快速上手。它只有两个头文件和四个cpp文件。只需要把它们简单地加到你的项目中就行了。有一个例子文件——xmltest.cpp来引导你该怎么做。 TinyXML以Zlib许可来发布,所以你可以在开源或者商业软件中使用它。许可证更具体的描述在每个源代码文件的顶部可以找到。 TinyXML在保证正确和恰当的XML输出的基础上尝试成为一个灵活的解析器。TinyXML可以在任何合理的C++适用系统上编译。它不依赖于异常或者运行时类型信息,有没有STL支持都可以编译。TinyXML完全支持UTF-8编码和前64k个字符实体(译注:如果你不明白这句译文,可能你需要了解一下Unicode编码)。 它无法做些什么 TinyXML不解析不使用DTDs(文档类型定义)或者XSLs(可扩展样式表语言)。有其它解析器(到www.sourceforge.org搜索一下XML)具有更加全面的特性,但它们也就更大,需要花更长的时间来建立你的项目,有更陡的学习曲线,而且经常有一个更严格的许可协议。如果你是用于浏览器或者有更复杂的XML需要,那么TinyXML不适合你。 下面的DTD语法在TinyXML里是不做解析的: 因为TinyXML把它看成是一个带着非法嵌入!ELEMENT结点的!DOCTYPE结点。或许这在将来会得到支持。 指南 有耐性些,这是一份能很好地指导你怎么开始的指南,它(非常短小精悍)值得你花时间完整地读上一遍。 TinyXML指南 代码状况 TinyXML是成熟且经过测试的代码,非常健壮。如果你发现了漏洞,请提交漏洞报告到sourcefore网站上 (www.sourceforge.net/projects/tinyxml)。 我们会尽快修正。 有些地方可以让你得到提高,如果你对TinyXML的工作感兴趣的话可以上sourceforge查找一下。 相关项目 你也许会觉得TinyXML很有用!(简介由项目提供) TinyXPath (http://tinyxpath.sourceforge.net). TinyXPath是一个小巧的XPath语法译码器脚本,用C++成。 TinyXML++ (http://code.google.com/p/ticpp/). TinyXML++是一个全新的TinyXML接口,使用了许多诸如模板,异常处理和更好的错误处理这些C++强项技术。 特性 使用STL TinyXML可以被编译成使用或不使用STL。如果使用STL,TinyXML会使用std::string类,而且完全支持std::istream,std::ostream,operator<>。许多API方法都有 ‘const char*’和’const std::string&’两个版本。 如果被编译成不使用STL,则任何STL都不会被包含。所有string类都由TinyXML它自己实现。所有API方法都只提供’const char*’传入参数。 使用运行时定义: TIXML_USE_STL 来编译成不同的版本。这可以作为参数传给编译器或者在“tinyxml.h”文件的第一行进行设置。 注意:如果在Linux上编译测试代码,设置环境变量TINYXML_USE_STL=YES/NO可以控制STL的编译。而在Windows上,项目文件提供了STL和非STL两种目标文件。在你的项目中,在tinyxml.h的第一行添加"#define TIXML_USE_STL"应该是最简单的。 UTF-8 TinyXML支持UTF-8,所以可以处理任何语言的XML文件,而且TinyXML也支持“legacy模式”——一种在支持UTF-8之前使用的编码方式,可能最好的解释是“扩展的ascii”。 正常情况下,TinyXML会检测出正确的编码并使用它,然而,通过设置头文件中的TIXML_DEFAULT_ENCODING值,TinyXML可以被强制成总是使用某一种编码。 除非以下情况发生,否则TinyXML会默认使用Legacy模式: 如果文件或者数据流以非标准但普遍的"UTF-8引导字节" (0xef 0xbb 0xbf)开始,TinyXML会以UTF-8的方式来读取它。 如果包含有encoding="UTF-8"的声明被读取,那么TinyXML会以UTF-8的方式来读取它。 如果读取到没有指定编码方式的声明,那么TinyXML会以UTF-8的方式来读取它。 如果包含有encoding=“其它编码”的声明被读取,那么TinyXML会以Legacy模式来读取它。在Legacy模式下,TinyXML会像以前那样工作,虽然已经不是很清楚这种模式是如何工作的了,但旧的内容还得保持能够运行。 除了上面提到的情况,TinyXML会默认运行在Legacy模式下。 如果编码设置错误或者检测到错误会发生什么事呢?TinyXML会尝试跳过这些看似不正确的编码,你可能会得到一些奇怪的结果或者乱码,你可以强制TinyXML使用正确的编码模式。 通过使用LoadFile( TIXML_ENCODING_LEGACY )或者LoadFile( filename, TIXML_ENCODING_LEGACY ), 你可以强制TinyXML使用Legacy模式。你也可以通过设置TIXML_DEFAULT_ENCODING = TIXML_ENCODING_LEGACY来强制一直使用Legacy模式。同样的,你也可以通过相同的方法来强制设置成TIXML_ENCODING_UTF8。 对于使用英文XML的英语用户来说,UTF-8跟low-ASCII是一样的。你不需要知道UTF-8或者一点也不需要修改你的代码。你可以把UTF-8当作是ASCII的超集。 UTF-8并不是一种双字节格式,但它是一种标准的Unicode编码!TinyXML当前不使用或者直接支持wchar,TCHAR,或者微软的_UNICODE。"Unicode"这个术语被普遍地认为指的是UTF-16(一种unicode的宽字节编码)是不适当的,这是混淆的来源。 对于“high-ascii”语言来说——几乎所有非英语语言,只要XML被编码成UTF-8, TinyXML就能够处理。说起来可能有点微妙,比较旧的程序和操作系统趋向于使用“默认”或者“传统”的编码方式。许多应用程序(和几乎所有现在的应用程序)都能够输出UTF-8,但是那些比较旧或者难处理的(或者干脆不能使用的)系统还是只能以默认编码来输出文本。 比如说,日本的系统传统上使用SHIFT-JIS编码,这种情况下TinyXML就无法读取了。但是一个好的文本编辑器可以导入SHIFT-JIS的文本然后保存成UTF-8编码格式的。 Skew.org link上关于转换编码的话题做得很好。 测试文件“utf8test.xml”包含了英文、西班牙文、俄文和简体中文(希望它们都能够被正确地转化)。“utf8test.gif”文件是从IE上截取的XML文件快照。请注意如果你的系统上没有正确的字体(简体中文或者俄文),那么即使你正确地解析了也看不到与GIF文件上一样的输出。同时要注意在一个西方编码的控制台上(至少我的Windows机器是这样),Print()或者printf()也无法正确地显示这个文件,这不关TinyXML的事——这只是操作系统的问题。TinyXML没有丢掉或者损坏数据,只是控制台无法显示UTF-8而已。 实体 TinyXML认得预定义的特殊“字符实体”,即: & & < > " " ' ‘ 这些在XML文档读取时都会被辨认出来,并会被转化成等价的UTF-8字符。比如下面的XML文本: Far & Away 从TiXmlText 对象查询出来时会变成"Far & Away"这样的值,而回XML流/文件时会以“&”的方式回。老版本的TinyXML“保留”了字符实体,而在新版本中它们会被转化成字符串。 另外,所有字符都可以用它的Unicode编码数字来指定, " "和" "都表示不可分的空格字符。 打印 TinyXML有几种不同的方式来打印输出,当然它们各有各的优缺点。 Print( FILE* ):输出到一个标准C流中,包括所有的C文件和标准输出。 "相当漂亮的打印", 但你没法控制打印选项。 输出数据直接到FILE对象中,所以TinyXML代码没有内存负担。 被Print()和SaveFile()调用。 operator<<:输出到一个c++流中。 与C++ iostreams集成在一起。 在"network printing"模式下输出没有换行符,这对于网络传输和C++对象之间的XML交换有好处,但人很难阅读。 TiXmlPrinter:输出到一个std::string或者内存缓冲区中。 API还不是很简练。 将来会增加打印选项。 在将来的版本中可能有些细微的变化,因为它会被改进和扩展。 流 设置了TIXML_USE_STL,TinyXML就能支持C++流(operator <>)和C(FILE*)流。但它们之间有些差异你需要知道: C风格输出: 基于FILE* 用Print()和SaveFile()方法 生成具有很多空格的格式化过的输出,这是为了尽可能让人看得明白。它们非常快,而且能够容忍XML文档中的格式错误。例如一个XML文档包含两个根元素和两个声明仍然能被打印出来。 C风格输入: 基于FILE* 用Parse()和LoadFile()方法 速度快,容错性好。当你不需要C++流时就可以使用它。 C++风格输出: 基于std::ostream operator<> 从流中读取XML使其可用于网络传输。通过些小技巧,它知道当XML文档读取完毕时,流后面的就一定是其它数据了。TinyXML总假定当它读取到根结点后XML数据就结束了。换句话说,那些具有不止一个根元素的文档是无法被正确读取的。另外还要注意由于STL的实现和TinyXML的限制,operator>>会比Parse慢一些。 空格 对是保留还是压缩空格这一问题人们还没达成共识。举个例子,假设‘_’代表一个空格,对于"Hello____world",HTML和某些XML解析器会解释成"Hello_world",它们压缩掉了一些空格。而有些XML解析器却不会这样,它们会保留空格,于是就是“Hello____world”(记住_表示一个空格)。其它的还建议__Hello___world__应该变成Hello___world 。 这是一个解决得不能让我满意的问题。TinyXML一开始就两种方式都支持。调用TiXmlBase::SetCondenseWhiteSpace( bool )来设置你想要的结果,默认是压缩掉多余的空格。 如果想要改变默认行为,你应该在解析任何XML数据之前调用TiXmlBase::SetCondenseWhiteSpace( bool ) ,而且我不建议设置之后再去改动它。 句柄 想要健壮地读取一个XML文档,检查方法调用后的返回值是否为null是很重要的。一种安全的检错实现可能会产生像这样的代码: TiXmlElement* root = document.FirstChildElement( "Document" ); if ( root ) { TiXmlElement* element = root->FirstChildElement( "Element" ); if ( element ) { TiXmlElement* child = element->FirstChildElement( "Child" ); if ( child ) { TiXmlElement* child2 = child->NextSiblingElement( "Child" ); if ( child2 ) { // Finally do something useful. 用句柄的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样: TiXmlHandle docHandle( &document ); TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement(); if ( child2 ) { // do something useful 这处理起来容易多了。 查阅TiXmlHandle可以得到更多的信息。 行列追踪 对于某些应用程序来说,能够追踪节点和属性在它们源文件中的原始位置是很重要的。另外,知道解析错误在源文件中的发生位置可以节省大量时间。 TinyXML能够追踪所有结点和属性在文本文件中的行列原始位置。TiXmlBase::Row() 和 TiXmlBase::Column() 方法返回结点在源文件中的原始位置。正确的制表符号可以经由TiXmlDocument::SetTabSize() 来配置。 使用与安装 编译与运行xmltest: 提供了一个Linux Makefile和一个Windows Visual C++ .dsw 文件。只需要简单地编译和运行,它就会在你的磁盘上生成demotest.xml文件并在屏幕上输出。它还尝试用不同的方法遍历DOM并打印出结点数。 那个Linux makefile很通用,可以运行在很多系统上——它目前已经在mingw和MacOSX上测试过。你不需要运行 ‘make depend’,因为那些依赖关系已经硬编码在文件里了。 用于VC6的Windows项目文件 tinyxml: tinyxml 库,非STL tinyxmlSTL: tinyxml 库,STL tinyXmlTest: 用于测试的应用程序,非STL tinyXmlTestSTL: 用于测试的应用程序,STL Makefile 在makefile的顶部你可以设置: PROFILE,DEBUG,和TINYXML_USE_STL。makefile里有具体描述。 在tinyxml目录输入“make clean”然后“make”,就可以生成可执行的“xmltest”文件。 在某一应用程序中使用: 把tinyxml.cpp,tinyxml.h, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.cpp, 和 tinystr.h 添加到你的项目和makefile中。就这么简单,它可以在任何合理的C++适用系统上编译。不需要为TinyXML打开异常或者运行时类型信息支持。 TinyXML怎么工作 举个例子可能是最好的办法,理解一下: Go to the Toy store! Do bills 它称不上是一个To Do列表,但它已经足够了。像下面这样读取并解析这个文件(叫“demo.xml”)你就能创建一个文档: TiXmlDocument doc( "demo.xml" ); doc.LoadFile(); 现在它准备好了,让我们看看其中的某些行和它们怎么与DOM联系起来。 第一行是一个声明,它会转化成TiXmlDeclaration 类,同时也是文档结点的第一个子结点。 这是TinyXML唯一能够解析的指令/特殊标签。一般来说指令标签会保存在TiXmlUnknown 以保证在它保存回磁盘时不会丢失这些命令。 这是一个注释,会成为一个TiXmlComment对象。 "ToDo"标签定义了一个TiXmlElement 对象。它没有任何属性,但包含另外的两个元素。 生成另一个TiXmlElement对象,它是“ToDo”元素的子结点。此元素有一个名为“priority”和值为“1”的属性。 Go to the TiXmlText ,这是一个叶子结点,它不能再包含其它结点,是"Item" TiXmlElement的子结点。 另一个TiXmlElement, 这也是“Item”元素的子结点。 等等 最后,看看整个对象树: TiXmlDocument "demo.xml" TiXmlDeclaration "version=’1.0′" "standalone=no" TiXmlComment " Our to do list data" TiXmlElement "ToDo" TiXmlElement "Item" Attribtutes: priority = 1 TiXmlText "Go to the " TiXmlElement "bold" TiXmlText "Toy store!" TiXmlElement "Item" Attributes: priority=2 TiXmlText "Do bills" 文档 本文档由Doxygen使用‘dox’配置文件生成。 许可证 TinyXML基于zlib许可证来发布: 本软件按“现状”提供(即现在你看到的样子),不做任何明确或隐晦的保证。由使用此软件所引起的任何损失都决不可能由作者承担。 只要遵循下面的限制,就允许任何人把这软件用于任何目的,包括商业软件,也允许修改它并自由地重新发布: 1. 决不能虚报软件的来源;你决不能声称是你是软件的第一作者。如果你在某个产品中使用了这个软件,那么在产品文档中加入一个致谢辞我们会很感激,但这并非必要。 2. 修改了源版本就应该清楚地标记出来,决不能虚报说这是原始软件。 3. 本通告不能从源发布版本中移除或做修改。 参考书目 万维网联盟是定制XML的权威标准机构,它的网页上有大量的信息。 权威指南:http://www.w3.org/TR/2004/REC-xml-20040204/ 我还要推荐由OReilly出版由Robert Eckstein撰的"XML Pocket Reference"……这本书囊括了入门所需要的一切。 捐助者,联系人,还有简史 非常感谢给我们建议,漏洞报告,意见和鼓励的所有人。它们很有用,并且使得这个项目变得有趣。特别感谢那些捐助者,是他们让这个网站页面生机勃勃。 有很多人发来漏洞报告和意见,与其在这里一一列出来不如我们试着把它们到“changes.txt”文件中加以赞扬。 TinyXML的原作者是Lee Thomason(文档中还经常出现“我”这个词) 。在Yves Berquin,Andrew Ellerton,和tinyXml社区的帮助下,Lee查阅修改和发布新版本。
基于hhww改进版的传统五笔输入法 在hhhhwwww改进版输入法(生成器)的基础上,修改了背景颜色、取消了Ctrl+M换码、取消了切换码表的显示颜色、修改了“\”为“、"等细节完善! 此五笔输入法是用hhhhwwww改进的输入法生成器制作而成,是他的开拓性的工作,使本输入法臻于完美。 此五笔输入法安装包集成的输入法设置工具imetool是由Silence开发的,此工具可以方便地调节输入法的外观和操作参数。 在此向hhhhwwww及Silence致谢! ============================================================= 一、本输入法改进了哪些方面? 1、支持生成大词库、支持码表中存在标点符号 2、可以用Shift直接切换中英文状态 3、启动初始为中文状态 4、小键盘的 “.”不会变为“。” 5、可选用取消空码锁定键盘 6、“动态码长”,即唯一码自动上屏。唯一的三码词组或全码单字不上屏。 7、汉字上屏后,编码输入框同时消失 8、可选用 ;‘ 选二三重码 9、可选用 ,。 翻页 10、设置项时,编码可以上屏 11、,./;即使为码元,第一码也按标点输出 12、更正设置“插空格”后输出错误等一些BUG 13、更正批量造词的BUG 14、加入六个选项,更自由的定制输入习惯 15、两码及以上才显示词组 16、UNICODE版可细分输出字符集 17、支持便携特征,可在注册表中定义码表目录 18、支持Vista中IE7保护模式 二、使用方法 1、本输入法安装包可用winrar打开及修改 2、使用安装包内的ImegenU.exe时(XP环境),请先将sw.ime复制到windows\system32目录,并改名为ImegenU.tpl 3、使用安装包内的Imegen9x.exe时(win98环境),请先将sw9x.ime复制到windows\system目录,并改名为Imegen.tpl 20081201更新: *修正反查编码一定要启动一次才生效的BUG *修正设置“繁体输出”和“词组联想”程序崩溃的BUG *优化程序流程。原版每打一个字都会读一次MB,频繁读硬盘,效率很低。 *CTRL+M 切换字符集失效调整为 CTRL+/ 20081125更新: *修正在Vista中,在其它程序调用过后,IE7调用本输入法时出错的Bug 20070925新性: + 加入便携特征,可在注册表中定义码表目录 + 加入对Vista中IE7保护模式(UAC)的支持 + 集成一个安装程序,方便输入法安装 注: 1、关于NTFS分区中Guest用户不能使用问题,用以下命令设置码表权限: cacls "%windir%\system32\我的输入法.mb" /t /e /c /g users:w 2、在Vista中IE7(UAC)下不能使用问题,用以下命令设置一下码表级别: icacls.exe "%windir%\system32\我的输入法.mb" /SetIntegrityLevel Level src="./images/smilies/sweat.gif" border=0 smilieid="10"> 3、自定义目录码表目录的例子,输入法为winwb86: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion] "winwb86.mb"="c:\\temp" (保存为reg文件,导入) 4、如果不想通过注册表,而在文件中强制定义码表目录: 第一步:0x023C58:EB 00 改为 EB 66 第二步:0x0241D0:Unicode码的C:\Temp 改为自设目录,最长24个字符 20061205新性: * 更正有查询码时(如五笔czol)空码时,锁定键盘的BUG * 取消强制中文标点,即:CTRL+SPACE 关闭再打开输入法保持原状态 + CTRL+,调整为临时切换 “繁体输出” 本版支持:一些网友的定制要求解决方法: 1、定制候选框颜色方法: 0x1EB60 : 00005500 00800000 00000000 分别对应“候选、重码、联想”状态的颜色,可以自行修改。 2、字符集只要GB和GBK集方法: 第一步:用eXecope.exe等工具隐藏GBK、GB18030(Unicode作为GBK) 第二步:0x143DE 处 833803--->>>833801 第三步:0x0296F 处 E9FC800200---->>>E90F810200 3、“○”在GB也显示问题方案:将它放入自定义词组中 20060915新性: * 修正BUG:首次启动默认为 GB2312 * 修正BUG:自定义词优先显示不再吃词 * 修正BUG:翻页不再出错 + 自定义词组不受 “字符集” 限制 + “反查编码”可以反查自身了 20060403版: 1、增加“四码以上推字上屏”功能:最大码长大于4时,如果5码有字/词,则显示,否则首个重码上屏 2、自定义词组优先显示: 3、似乎解决了“翻页锁定程序”的BUG:根据流程,乱改一处代码,不知是否有用。 051130版新性 + 可以直接设置 Space、Enter + 面板颜色提示当前输出字符集 + 增加输入繁体功能 + 可選重、空碼提示音 * 有候選字時,屏蔽 Shift+符號(解决BUG临时方案) * 更正Enter输出编码的小BUG 051102版新性 本版为UNICODE版 * 更正排序时出错的BUG * 更正编译较大码表出错的BUG 050908版新性 * 更正反查编码BUG(提示:注册表中可设置反查自身编码) * UNICODE版,更正编译包括GB18030字的码表时组词编码错 乱的BUG (导出时GB18030字所带的组词码是垃圾,不用理会) * 更正SPACE=1时偶尔会锁键盘的BUG * 完善汉字上屏编码框同时消失功能,智能检测是否设置 “反查编码”,没有设置时生效 050831版新性: + 增加 GB/GBK/GB18030/UNICODE切换 * 完善=0编码上屏功能,空码时也有效 050826版新性: * 取消小于最大码长有重码时,一次空格上屏 ( 原版有此功能,注册表中直接设置=1即可 ) 050824版新性: * 更正CTRL+SHIFT切换有时会转入英文状态的BUG * 更正批量造词保存时出现乱码的BUG * 加入自定义词库导出功能 * 设置=0时,编码上屏 * 完善“动态码长”功能。小于最大码长而无后继码,重码 时自动转为候选状态,部分代码来自LoveEB 二、您还可以自和修改输入法ime文件(需要一些软件方面的知识,请确认您能看懂下面这些再去做) 输入法ime文件的可选修改项: ====================================================== 恢复 \ 号输入“、”問題: 6683FF2F750C6A00680130 -> 6683FF5C750C6A00680130 ============================== 改为右Shift键问题: 要修改两处:2A -->> 36 :73914DA8 807D122A cmp byte ptr [ebp+12], 2A :73914DE0 807D122A cmp byte ptr [ebp+12], 2A ============================== 修改为两shift切換: 122A --->>> 0C10 搜索一下,有兩處地方要改。 ============================== 笔记本电脑特殊标点转换: []--->>>() , |--->>>: , ` --->>> . 0x14143:0F85B76C0100--->>>0F856F6C0100 ============================== 将检索字符集“GB2312”与“Unicode”的颜色对换: 7392B890 0FB605 BC1E9273 movzx eax,byte ptr ds:[73921EBC] 7392B897 48 dec eax 7392B898 76 25 jbe short winwb86.7392B8BF 7392B89A C70424 0000FF00 mov dword ptr ss:[esp],0FF0000 //gbk之蓝色 7392B8A1 48 dec eax 7392B8A2 76 1B jbe short winwb86.7392B8BF 7392B8A4 C70424 00000000 mov dword ptr ss:[esp],0 //gb2312之黑色 7392B8AB 48 dec eax 7392B8AC 76 11 jbe short winwb86.7392B8BF 7392B8AE C70424 FFFF0000 mov dword ptr ss:[esp],0FFFF //gb18030颜色 7392B8B5 48 dec eax 7392B8B6 76 07 jbe short winwb86.7392B8BF 7392B8B8 C70424 FF000000 mov dword ptr ss:[esp],0FF //unicode之红色 7392B8BF - E9 1B33FEFF jmp winwb86.7390EBDF ====================================================== 解决切换到GB18030字符集时多重候选因范围检查可能造成的翻页死机问题(如海峰五笔输入fggg,oitk等编码): 0x03206: 833D BC1E 9273 0074 3483 --->>> 833D BC1E 9273 0472 3483 ================================ 开启2~9选字自动调频方法: 0x10E28:83FB397704--->>>E9539F0100,设置“外碼提示”且取消“手动调频”时生效 关闭2~9选字自动调频方法: 0x10E28处E9539F0100改为83FB397704 选定“Ctrl+序号调频”时会屏蔽“自动调频” ================================= 颜色還原问题: 1.从系统system32目录里找到生成的ime文件,用eXeScope软件把有关位图替换为原版灰色系位图。 2.用WinHex软件替换ime文件中的以下内容: C745D403000100C745F01D000000 --->>> 6A01C745D403000100FFD38945F0 BF2602BB00 --->>> BF2000CC00 3.调整候选框背景色深浅(有5处): F0F0F0 (hhhhwwww设置的浅灰白色)--->>>C0C0C0 (传统灰色) 或 D8D8D8 (两者之间)。其中,0x92F4处为候选框背景色,0x9526,AF52,B0A9,E6E2几处共同决定输入框背景色。 ================================ 取消Ctrl+M调整字符:0x141CD 的7408--->>>0xEB08 :73914DBE 807D1232 cmp byte ptr [ebp+12], 32 :73914DC2 7513 jne 73914DD7 :73914DC4 8B5D14 mov ebx, dword ptr [ebp+14] :73914DC7 8A5B11 mov bl, byte ptr [ebx+11] :73914DCA F6C380 test bl, 80 :73914DCD 7408 je 73914DD7 ------>>>>> EB08 jmp 73914DD7 :73914DCF E804020000 call 73914FD8 :73914DD4 EB2A jmp 73914E00 :73914DD6 90 nop ============================== 关于:默认安装时是unicode字符集问题 用exescope看看资源 RCData --》》IMECHARAC(偏移0x22DA4):目前是EE 04 。 用“计算器”将“EE”用二进制查看,共八位每一位分别对应设置中的每一个选项。扩展选项只有第四第八项可以设置。 将04改为00即是Unicode ============================= Space参数就是空格是否强制上屏: 例如:两个都是三码的字,并且重码。如果Space=0,打完三码后按了空格后就出现重码框。 如果Space=1,打完三码后按了空格,第一重码就上屏,不会出现重码框。 在注册表中设置即可 ============================== 当开启了动态码长之后,若码表中的MaxCodes设为超过4码,则有些五笔四码字词不能自动被顶上屏。(在重码较多时发生,重码少时未发现此现象。) 正常,原版即是这么处理。原来的程序员定义“SPACE直接上屏”的标志可能也与之有关 ============================ 输入法设置工具 IME TOOL http://www.mympc.org 声明:IMETool 为免费软件,非商业使用无须授权,但不得对软件本身做任何修改。允许个人开发的免费输入法软件将其加入安装包使用,但安装包内不得包含有广告插件或流氓软件。 IME TOOL 支持中英文界面,适用于 Win98/ME/2000/XP/2003 操作系统,目前不支持 VISTA。 主要功能: 一、动态调整输入法顺序而无须重启。 二、切换输入法指示器和高级文字服务方式。 三、任意设置输入法热键 Windows 本身的输入法热键设置功能限制很多,2000/XP 下更是如此,你不得不设置 ctrl+shift+3 这样的三键热键。IME Tool 让你可以自由地设置各种热键,基本键(ctrl、alt、shift)共有六种组合,辅助键有 91 个可选,如用左 Alt+左 Window 键激活龙文五笔,shift+down 激活紫光拼音。当然,有些热键组合是不能用的,如 shift+数字字母键。 四、注册表错误项目修正 1、自动删除输入法列表中不存在的输入法项目,位置: HKEY_CURRENT_USER\Keyboard Layout\preload 2、检查注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts 下的内容,如果某分支对应的输入法文件不存在,则删除此分支(需要管理员权限)。 3、自动删除输入法从列表中删除后可能遗留的激活热键设置,位置: HKEY_CURRENT_USER\Control Panel\Input Method\Hot Keys 五、输入法键盘定义功能,适用于非英文键盘(需要管理员权限)。 六、安装删除输入法 IME TOOL 可以安装标准格式的输入法。自行复制 ime 和 mb 文件到系统目录中,然后使用 imetool 的安装输入法功能指定输入法名称和 ime 文件即可。 IME TOOL 可以从注册表中删除不需要的输入法,但并不删除文件。 七、其它功能 打开输入法属性、打开关闭输入法状态条等。支持命令行参数,支持运行脚本。 另外修正了老版本存在的一些小 bug。 局限: 1、在 Win9x 下设置的输入法热键不能立即生效,必须重启。在 Win95/NT 系统下有更多的功能限制。 注意: 1、用 IME Tool 设置的一些热键在 Windows 本身的输入法设置中会无法正确显示,但不影响使用。 2、繁体、韩文、日文系统下的打开关闭输入法等切换键设置在注册表中的位置不同,因条件所限我没有做进一步测试功能是否有效。 3、在 IME Tool 中刚添加的输入法不能立即设置属性。 4、如果使用输入法指示器方式时,在系统目录下未发现 internat.exe 和 indicdll.dll 文件,将会自动复制当前目录下的此二文件过去(如果存在)。 命令行参数说明: /? /h /help 显示此帮助 /on 启用 internat.exe 或 ctfmon.exe /off 禁用 internat.exe 或 ctfmon.exe /internat 输入法指示器风格 /ctfmon 高级文字服务风格 /status:<0/1> <0>: 关闭输入法状态条,<1>: 显示输入法状态条 /caps 用 Caps 键关闭大 /shift 用 Shift 键关闭大 /switch:<0/1/2/3> <0>: 不使用切换语言和切换键盘布局热键 <1>: 仅使用切换语言热键 <2>: 仅使用切换键盘布局热键 <3>: 同时使用切换语言和切换键盘布局热键 : 切换语言热键使用Ctrl+Shift : 切换键盘布局热键使用Ctrl+Shift /hotkey:<1/2/3/a/b/c>,[hotkey] 指定输入法热键 <1/2/3..>,指定第1、2、3.. 个输入法的热键 指定打开/关闭输入法的热键 指定全角/半角切换的热键 指定中英文标点切换的热键 如果留空则删除热键 [hotkey] 热键值,如:ctrl+space /add1:,[hotkey] 按名称添加输入法到列表 /add2:,[hotkey] 按文件名添加输入法到列表 /add3:,[hotkey] 按 ID 添加输入法到列表 /del1:<1/2/3> 按顺序从列表中删除输入法 /del2: 按名称从列表中删除输入法 /del3: 按文件名从列表中删除输入法 /del4: 按 ID 从列表中删除输入法 /install:[name],,[hotkey] 安装输入法 /uninstall1: 按名称从注册表删除输入法 /uninstall2: 按文件从注册表删除输入法 /uninstall3: 按 ID 从注册表删除输入法 /move1:, 按名称调整输入法顺序, 为调整后的序号,下同 /move2:, 按文件名调整输入法顺序 /move3:, 按 ID 调整输入法顺序 /load: 从配置文件调入参数 [hotkey] 格式: Ctrl+Shift_8_Left,如果同时使用左右键,则可以为: Ctrl+Shift_8。 注意:要在命令行参数设置“/”和“,”作为辅助热键时,为避免和参数前导符和分隔符冲突,应为“?”和“<”,如:ctrl_?_right、alt_< 要安装一个输入法到注册表时,须手工复制文件,xx.ime 文件必须复制到系统目录中。使用 /install 参数安装时,xx.ime 文件名前不能加路径,如: imetool /install:中文(简体) - 智能 ABC,winabc.ime 欢迎测试并反馈 bug。 更新: 2.8.0 版,修正“APPS”(右键菜单键)热键误设为右 Windows 键的问题。 2.7.9 版,修正热键选择为“无”,确定后程序非法操作的问题。 2.7.8 版,修正在输入法风格里连续点击同一个模式单选框时,输入法切换热键会来回切换问题。 2.7.7 版,修订网友发现的两处错误。 2.7.6 版,改进某些特殊输入法名称显示不正确的问题(如微软拼音2007) 2.7.5 版,刚刚发现增加了修改输入法名称后带来个输入法列表显示可能会错位的问题,再修订…… 2.7.4 版,主要是增加了繁体显示界面;修改 internat.exe 和 ctfmon.exe 在注册表中的值,以和系统保持一致。 2.7.3 版,圣诞节更新 IMETool 至 2.7.2,此版本语句变化较多。主要是增强对 VISTA 的兼容性;改进输入法列表中输入法名称的显示方式;增加自定义输入法名称功能(仅对高级文字服务模式有效,点击列表中输入法名称或按 F2 进行修改,如应用后看不到效果,注销或重启即可);修订在 2003 下列表可能不显示的问题,修订一些其它 bug。 2.7.1 版,修订重复热键可能无法取消的 bug。 2.7.0 版,修订热键重复提示的 bug。 2.6.9 版,增加一种修复注册表重复项目功能。 2.6.8 版, 增加三个命令行参数,用以调整输入法顺序。改善输入法状态条显示问题。增加一些状态条显示信息。帮助文档改用 utf-8 格式保存。 2.6.7 版,修订上一版本在 2003 下无法正常显示输入法列表的问题(此问题是由我使用的新版本控件bug引起)。 2.6.6 版,增加两个命令行参数,修订以命令行方式添加输入法时在某些情况下添加多余输入法的问题。 2.6.5 版,使高级文字服务和输入法指示器风格下的输入法切换热键保持一致,文字提示稍做调整,便于用户理解。增加常见问题说明。 2.6.4 版,程序内部一些调整。 2.6.3 版,程序内部一些调整。 2.6.2 版,解决某些情况下可能会使输入法指示条消失的问题(注:经仔细测试,此问题并未解决,具体原因不明,待研究)。 2.6.1 版,实现了带参数运行时完全隐藏主界面。 2.6.0 版,修复使用 /install 参数时在某种情况下会运行出错的 bug。参数中的分隔符由竖线改为逗号。 2.5.9 版,将自动复制 internat.exe/indicdll.dll 的源路径由当前路径改为 imetool.exe 所在路径。在程序左上角菜单中增加命令行参数提示。 2.5.8 版,修改键盘定义对话框丢失下拉列表问题(真是莫名其妙),一些细节调整。 2.5.7 版,修订其它切换热键的设置按钮文字不会随左边的下拉列表切换的 bug。 2.5.6 版,应网友要求取消气球提示,改为状态栏提示。 2.5.5 版,增强对语言栏丢失时的修复功能(有时需要注销后方可生效)。 2.5.4 版,修订设置热键时小键盘某些键值不对的问题。 2.5.3 版,修订启动时检测输入法风格可能不对的 bug。 2.5.2 版,本修订添加输入法时图标显示的一处 bug。高级/从注册表删除输入法时可在输入法显示框中用鼠标滚轮切换不同的输入法。 2.5.1 版,修订一些程序上的 bug,添加关于信息。 2.5.0 版,支持命令行参数、支持从脚本调入参数运行。 2.4.5 版,修订安装输入法时导致出错的问题。 2.4.4 版,继续修订 bug。 2.4.3 版,修正 2.4.2 版未完全修正的问题。 2.4.2 版,修正点击应用按键后一些显示状态错位问题。 2.4.1 版,修正热键设置窗口状态显示不正常问题。 2.4.0 版,重新调整界面布局。增加应用按钮。安装 ime 文件时可以自动获取文件信息做为输入法名称。调整程序处理流程。 2.3.1 版,更新:大关闭键设置后可立即生效;在输入法列表的不同列上双击可分别打开属性和热键设置。压缩包中的 internat.exe 做了修改,在其右键上选择属性可打开 imetool。另外修订一些 bug。 2.3.0 版,增加安装删除输入法功能;增加一些项目的浮动提示;增加可安装输入法(语言)的范围;修正一些小的 bug。改变版本号的命名方式便之规范化。 2.22 版,一些内部项目的调整。 2.21 版,修订会误删除某些注册表项目的 bug。 2.2 版,可以将排列第一位的输入法立即设为默认输入法而无须重启。 2.12 版,修正输入法打开关闭等热键无法取消的 bug。 2.11 版,修正某些情况下程序会无法运行的 bug。 本压缩包中附带的 internat.exe 和 indicdll.dll 为从 Windows 2000 Pro 简体中文版中提取并修改过,适用于 XP/2003。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧