关于字符转换的讨论

char * 转换为TCHAR类型??
直接转换,TCHAR相当于char了
char * s;
TCHAR * s1=(TCHAR *)s; 
回复人: dysxq() (2001-12-21 21:26:25) 得0分 
要看你的程序设置是ANSI还是UNICODE, 如果是ANSI,直接转,如果是UNICODE,TCHAR相当于WCHAR, 要用mbstowcsz转一下 
回复人: xiaoxiaohan(萧晓寒) (2001-12-21 23:52:17) 得0分 
Unicode :宽字节字符集
1. 如何取得一个既包含单字节字符又包含双字节字符的字符串的字符个数?
可以调用Microsoft Visual C++的运行期库包含函数_mbslen来操作多字节(既包括单字节也包括双字节)字符串。
调用strlen函数,无法真正了解字符串中究竟有多少字符,它只能告诉你到达结尾的0之前有多少个字节。
2. 如何对DBCS(双字节字符集)字符串进行操作?
函数 描述
PTSTR CharNext ( LPCTSTR ); 返回字符串中下一个字符的地址
PTSTR CharPrev ( LPCTSTR, LPCTSTR ); 返回字符串中上一个字符的地址
BOOL IsDBCSLeadByte( BYTE ); 如果该字节是DBCS字符的第一个字节,则返回非0值
3. 为什么要使用Unicode?
(1) 可以很容易地在不同语言之间进行数据交换。
(2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
(3) 提高应用程序的运行效率。
Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成
Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结
果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序
更加有效地运行。
Windows CE 本身就是使用Unicode的一种操作系统,完全不支持ANSI Windows函数
Windows 98 只支持ANSI,只能为ANSI开发应用程序。
Microsoft公司将COM从16位Windows转换成Win32时,公司决定需要字符串的所有COM接口方法都只能接受Unicode字符串。
4. 如何编写Unicode源代码?
Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用
Unicode来对它进行编译。只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。
_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。
5. Windows定义的Unicode数据类型有哪些?
数据类型 说明
WCHAR Unicode字符
PWSTR 指向Unicode字符串的指针
PCWSTR 指向一个恒定的Unicode字符串的指针
对应的ANSI数据类型为CHAR,LPSTR和LPCSTR。
ANSI/Unicode通用数据类型为TCHAR,PTSTR,LPCTSTR。
6. 如何对Unicode进行操作?
字符集 特性 实例
ANSI 操作函数以str开头 strcpy
Unicode 操作函数以wcs开头 wcscpy
MBCS 操作函数以_mbs开头 _mbscpy
ANSI/Unicode 操作函数以_tcs开头 _tcscpy(C运行期库)
ANSI/Unicode 操作函数以lstr开头 lstrcpy(Windows函数)
所有新的和未过时的函数在Windows2000中都同时拥有ANSI和Unicode两个版本。ANSI版本函数结尾以A表示;Unicode版本函数结尾以W表示。
Windows会如下定义:
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif // !UNICODE
7. 如何表示Unicode字符串常量?
字符集 实例
ANSI “string”
Unicode L“string”
ANSI/Unicode T(“string”)或_TEXT(“string”)if( szError[0] == _TEXT(‘J’) ){ }
8. 为什么应当尽量使用操作系统函数?
这将有助于稍稍提高应用程序的运行性能,因为操作系统字符串函数常常被大型应用程序比如操作系统的外壳进程Explorer.exe所使用。由于
这些函数使用得很多,因此,在应用程序运行时,它们可能已经被装入RAM。
如:StrCat,StrChr,StrCmp和StrCpy等。
9. 如何编写符合ANSI和Unicode的应用程序?
(1) 将文本串视为字符数组,而不是chars数组或字节数组。
(2) 将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串。
(3) 将显式数据类型(如BYTE和PBYTE)用于字节、字节指针和数据缓存。
(4) 将TEXT宏用于原义字符和字符串。
(5) 执行全局性替换(例如用PTSTR替换PSTR)。
(6) 修改字符串运算问题。例如函数通常希望在字符中传递一个缓存的大小,而不是字节。这意味着不应该传递sizeof(szBuffer),而应该传
递(sizeof(szBuffer)/sizeof(TCHAR)。另外,如果需要为字符串分配一个内存块,并且拥有该字符串中的字符数目,那么请记住要按字节来
分配内存。这就是说,应该调用malloc(nCharacters *sizeof(TCHAR)),而不是调用malloc(nCharacters)。
10. 如何对字符串进行有选择的比较?
通过调用CompareString来实现。
标志 含义
NORM_IGNORECASE 忽略字母的大小写
NORM_IGNOREKANATYPE 不区分平假名与片假名字符
NORM_IGNORENONSPACE 忽略无间隔字符
NORM_IGNORESYMBOLS 忽略符号
NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符
SORT_STRINGSORT 将标点符号作为普通符号来处理
11. 如何判断一个文本文件是ANSI还是Unicode?
判断如果文本文件的开头两个字节是0xFF和0xFE,那么就是Unicode,否则是ANSI。
12. 如何判断一段字符串是ANSI还是Unicode?
用IsTextUnicode进行判断。IsTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容。由于这不是一种确切的科学方法,因此 
IsTextUnicode有可能返回不正确的结果。
13. 如何在Unicode与ANSI之间转换字符串?
Windows函数MultiByteToWideChar用于将多字节字符串转换成宽字符串;函数WideCharToMultiByte将宽字符串转换成等价的多字节字符串。

回复人: xtky_limi(痛在心中笑在脸上) (2001-12-22 0:35:58) 得0分 
上面说的已经比较全了。 
回复人: xtky_limi(痛在心中笑在脸上) (2001-12-22 0:38:13) 得0分 
TEXT是宏
相当于L##

它可以根据编译环境确定为DBMS,还是UNICODE字符集

10。int类型转换为CString类型?
回复人: tjmxf(天涯) (2001-12-17 19:59:34) 得0分 
itoa() 
回复人: zf925(天下哪来那么多高手) (2001-12-17 20:00:30) 得22分 
char m[20];
str=str + itoa(i,m,10); 
回复人: yuezifeng(wybzd) (2001-12-17 20:00:50) 得22分 
CString str;
str.Format("%d",i);

回复人: kingfish(今飞) (2001-12-17 20:06:27) 得0分 
str.Format("%s%d",str,i); 
回复人: tanyajun(谈子) (2001-12-17 20:09:25) 得0分 
CString str="test";
int i=11;
CString str1;
str1.Format("%d",i);
str = str+str1;

回复人: guanjinke(纶巾客) (2001-12-17 20:10:42) 得0分 
int i=11;
CString str="test";
CString addition;
addition.Format("%d",i);
str+=addition;
就可以了。 

11。关于sprintf类型转换的问题
sprintf(buf,"select price from ls01 where p_date>='%'",t_date)
其中t_date是CTime类型,%后面应该是什么呢?%s是String类型,%c是char,那么CTime型对应的是什么呢? 

回复人: yakai(日落长河) (2001-12-17 17:45:47) 得0分 
sprintf(buf,"select price from ls01 where p_date>='%S'",(LPCSTR)t_date.Format( "%A, %B %d, %Y" ));
如果不行,就
char temp[50];
CString str=t_date.Format( "%A, %B %d, %Y" );
strcpy(temp,(LPCSTR)str);
sprintf(buf,"select price from ls01 where p_date>='%S'",temp);
CTime::Format返回CString 
回复人: loh(乐啸天涯) (2001-12-17 17:52:57) 得0分 
wait

don't know 
回复人: masterz() (2001-12-17 20:21:05) 得0分 
SQL语句中日期要写成字符串"yyyymmdd" 


12。类型转换 unsigned int <==>CString??
回复次数:8
发表时间:2001-12-17 10:25:23

unsigned int f;//unsigned int 0~4294967295
CString g;
f=2300000000;
g.Format("%d",f);
AfxMessageBox(g);
出错。


回复人: ydogg(灰毛兔频频) (2001-12-17 10:31:29) 得0分 
unsigned int f;//unsigned int 0~4294967295
CString g;
f=2300000000;
g.Format("%d",f);
MessageBox(g);//使用AfxMessageBox,需要窗口的句炳参数

回复人: asdmusic8(asdmusic8) (2001-12-17 10:35:15) 得0分 
我 AfxMessageBox(g); 和MessageBox(g); 都不错。
错的是g.从 2300000000=》1994967296

回复人: asdmusic8(asdmusic8) (2001-12-17 10:36:10) 得0分 
是2300000000=》-1994967296 类型转换错。

回复人: ydogg(灰毛兔频频) (2001-12-17 10:37:54) 得6分 
g.Format("%u",f);

回复人: asdmusic8(asdmusic8) (2001-12-17 10:40:24) 得0分 
to dgsnmpoperate 那怎么从 CString ==>>unsigned int 
回复人: kingfish(今飞) (2001-12-17 10:42:10) 得6分 
既然是 unsigned int,
超过 0x7f000000 (2130706432) 当然不能用 %d (signed int)用%u 
回复人: kingfish(今飞) (2001-12-17 10:44:57) 得8分 
CString ==>>unsigned int 
char *p = (LPSTR)(LPCSTR) g;
f = atoi(p); 

13。static_cast、dynamic_cast 和直接类型转换(如 (void *)p )的区别?
发表时间:2001-12-14 9:31:13

先拷贝MSDN中的一小段话:
class B { ... };
class C : public B { ... };
class D : public C { ... };

void f(D* pd)
{
C* pc = dynamic_cast<C*>(pd); // ok: C is a direct base class
// pc points to C subobject of pd 

B* pb = dynamic_cast<B*>(pd); // ok: B is an indirect base class
// pb points to B subobject of pd 
...
}
我已经知道 static_cast 和 dynamic_cast 的作用,但MSDN中并没有提到这两个操作符与直接类型转换如
void f(D* pd)
{
C* pc = (C*)(pd);

B* pb = (B*)(pd); 
...
}
的不同啊。不知道那位知道的告诉一声,在此不胜感谢,50分奉上。

回复贴子:ysdesigned(清泉) (2001-12-14 10:03:07) 得0分 
static_cast、dynamic_cast 代 替 简 单 的 强 制 转 化, 从 而 消 除 多 继 承 带 来 的 歧 义。 使 用 这 两 个 运 算 符 号, 我 们可以 在 对 象 运 行 过 程 中 获 取 对 象 的 类 型 信 息
dynamic_cast 用于多态类型的转换
static_cast 用于非多态类型的转换

回复人: masterz() (2001-12-14 10:05:48) 得0分 
static_cast<...>compile时能发现不正确的指针类型转换
dynamic_cast<...>运行时如果发现是不正确的指针类型转换会返回NULL
(void*)强制转换,如果是不正确的指针类型转换,没有办法检查,不如上面2中安全 
回复人: meady() (2001-12-14 11:29:05) 得0分 
类型安全 
回复人: bluecrest(为什么我的VC还是那么的菜) (2001-12-14 11:45:34) 得0分 
com技术内幕介绍过
我刚看完就忘了 

14。byte数据类型转换成int型??
我用byte型读进一组数据想把他转成int型进行运算如何做呢?
如果再把int型转回byte又怎么实现呢? 

回复人: louifox(兰陵笑笑生) (2001-12-6 9:18:38) 得0分 
用下面这些宏:
WORD MAKEWORD(
BYTE bLow, 
BYTE bHigh 
);
BYTE LOBYTE(
WORD wValue 
);
BYTE HIBYTE(
WORD wValue 
);

回复人: chskim(大刀阔斧) (2001-12-6 9:21:04) 得0分 
int i;
BYTE b;
b=128;
i=(int)b;

回复人: nannet(似的) (2001-12-6 9:38:24) 得0分 
这个宏怎么用呀?有没有简单一点儿的,我现在能把BYTE 转成INT 型了,再转回去直接赋值可以吗? 
回复人: louifox(兰陵笑笑生) (2001-12-6 9:46:24) 得20分 
WORD wa;
BYTE ba=32,bb=64;
wa=MAKEWORD(ba,bb);
...
WORD wa=1234;
BYTE ba,bb;
ba=LOBYTE(wa);
bb=LOBYTE(wa);

回复人: nannet(似的) (2001-12-6 9:54:55) 得0分 
问题解决了,多谢各位 

15。类型转换的问题,unsigned int --> lptstr/lpctstr??
发表时间:2001-8-7 23:49:41
如果强制转换的话,会出现致命错误,有什么好的办法呢?
能列举一些其他的办法吗?
谢谢大虾! 

回复人: AlphaOne(总是第一个倒下) (2001-8-8 0:02:43) 得5分 
你为什么要强行转换呢?
如果你是要把int 的值作为 lptstr/lpctstr 的内容的话,
可以用CString:
unsigned int a = 100;
LPCTSTR lpText;
CString str;
str.Format("%d",a);
lpText = (LPCTSTR)str;

回复人: tryibest(编の魂) (2001-8-8 8:20:20) 得5分 
wsprintf(str,"%u",ui); 
回复人: zzh() (2001-8-8 9:04:39) 得5分 
这种情况不需要进行强制转换,直接使用wsprintf就可以了。 
回复人: GJA106(中文字符) (2001-8-8 10:10:51) 得5分 
unsigned int m_na=22;
LPTSTR lptstr;
wsprintf(lptstr,"%u",m_na);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值