现在写比较正规的程序的时候,是不是都要支持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的?

谢谢!
...全文
77 15 打赏 收藏 转发到动态 举报
写回复
用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位下是一样的.

16,473

社区成员

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

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

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