[字符][替换]中间字符如何替换

09月 18th, 2008 by admin
Posted in VC/MFC | No Comments »

我有一个数据表,表中纪录很多,其中有D22401-3YT2(大约有30条纪录),D22102-3YT12(大约有35条纪录),D224032-32YT2(大约也有30条纪录),D22121-5YT3(大约30多条纪录),现在问题是对D22401-3YT2,D22102-3YT12,D224032-32YT2中的YT变换为LY,但是对D22121-5YT3中的YT又不变换。我是用
REPL   ALL   XX   WITH   'D22401-3LY2 '   FOR   TRIM(LL)== 'D22401-3YT2 '这样的语句一个一个来实现的。
有没有一个语句能够同时将YT变换为LY呢?

use   表名
replace   xx   with   strtran(xx, 'YT ', 'LY ')   for   alltrim(xx) <> 'D22121-5YT3 '

update   表名   set   xx=strtran(xx, 'YT ', 'LY ')   where   alltrim(xx) <> 'D22121-5YT3 '

我试了
UPDATE   SS   SET   XX=STRTRAN(LJH, 'YT ', 'LY ')   WHERE     HH= 'DD '   AND   HH <> 'DD-4308YTDB3 '   AND   HH <> 'DD-4308YTDB5 '
但是没有任何用处,
是怎么回事?

UPDATE   SS   SET   XX=STRTRAN(XX, 'YT ', 'LY ')   WHERE     HH= 'DD '   AND   HH <> 'DD-4308YTDB3 '   AND   HH <> 'DD-4308YTDB5 '

哈哈,是我将字段名写错了,是可行的。多谢十三豆先生

Tags: , ,

[字符][编码]还是关于字符编码的问题

07月 23rd, 2008 by admin
Posted in VC/MFC | No Comments »

环境 VS2005 WIN2000  默认设置

问:
1.当在对话框中添加一个了editbox,并将一个CString(其默认是CStringW对吗?)对象绑定在其上,那么当程序运行时,在对

  话框中输入字符串后,那个CString对像中得到的字符串是以UNICODE编码的吗?

2.如果是以UNICODE编码,那么怎么将CString对象中的字符串转换成UNICODE格式后保存在一个char数组中?

3.如我绑定CString对象时我直接在数据类型中填写CStringA,那么传入的字符串会是以ANSI编码的吗?

谢谢大家了。

(不是我懒,不愿意自己去试,而是实在没条件)

1
如果你设置unicode编码的话
2
直接GetBuffer(),再强制转化成char*用memcpy注意长度
3
通常会编译错误的

2.
WCHAR* pWchar = xxx.GetBuffer();
WideCharToMultiByte();//函数名字好像是这么写,具体忘了,你查查。
//就是将宽字节转化为多字节的操作。

hua2136正确

自己顶起,期待有满意的答案

VS2005默认是UNICODE的 转换按3楼的

Tags: , ,

[CString][字符]如何取CString 中的字符

07月 18th, 2008 by admin
Posted in VC/MFC | No Comments »

CString  lPD="ierudjrhe";
char AccPd[20];

for(int i=0;i <lPD.GetLength();i++)
{
AccPd[i]=lPD[i];

}
AccPd[i]='';

CString  lPD中可能接受别的参数,现在怎么把它去出来进行处理?我上边的程序是做把它赋值到一个字符数组里.

但是现在要求直接处理,不再浪费内存.怎么做啊?本人对字符数组比较熟悉,其他不清楚啊

在线等

用CString::GetAt( int nIndex )

CString strBuf = "1231321321";
char* pBuf = new char[strBuf.GetLength()];
pBuf = strBuf.GetBuffer();
delete pBuf;

引用 3 楼 edison318 的回复:
CString strBuf = "1231321321";
char* pBuf = new char[strBuf.GetLength()];
pBuf = strBuf.GetBuffer();
delete pBuf;

edison318 :
char* pBuf = new char[strBuf.GetLength()];
这个和字符数组有区别吗?
还是要开辟内存,呵呵,不过还是要谢谢啊

赋值到字符数组,直接strcpy就行了啊

引用 4 楼 lgogo 的回复:
引用 3 楼 edison318 的回复:
CString strBuf = "1231321321";
char* pBuf = new char[strBuf.GetLength()];
pBuf = strBuf.GetBuffer();
delete pBuf;

这样的操作有泄漏
char *pBuf = strBuf.GetBuffer(strBuf.GetLength());
strBuf.ReleaseBuffer();

要用GetBuffer,不要忘记ReleaseBuffer()哦.呵呵

TCHAR GetAt( int nIndex ) const
A TCHAR containing the character at the specified position in the string.

for example
CString s( "abcdef" );
char d[6];
for(i=0;i <6;i++)
{
  d[i]=s.GetAt(i);
}

CString  lPD="ierudjrhe";
char *AccPd;

AccPd=(char*)(LPCTSTR)lPD;
搞定啦,AccPd只是个指向lPD的指针
*AccPd就是字符,AccPd++就可以移动啦.应该符合老板的意思吧?

老板是说直接用,不再赋值到一个字符数组里,开辟内存.还打比方说,有东西放在那儿就直接拿来用,没有必要在先搬
到别处去再用.

谢谢大家啊

Tags: , ,

[CString][中文][字符]问一个关于CString中的中文字符的问题

07月 13th, 2008 by admin
Posted in VC/MFC | No Comments »

我使用CInternetFile类的ReadString(str)方法,读取了一个html文件中的字符串,串为" <!– 开始 –> ",
一共是14个字符,但是str.GetLength()却返回16,"开始"两字占了6个字节,为什么?
而且我对串进行分析,发现中文也不对,“开始”两字占的6个字节对应的分别是0xe5 0xbc 0×80 0xe5 0xa7 0×8b,
和他们的ACSII码也不相同,我觉得很是奇怪,但是用CStdioFile类的WriteString(str)方法,
将字符串写到一文件中,又发现内容是正确的,只是文件写成了unicode格式。
真是百思不得其解,这其中有什么机关?

确实是的,前面我看错了,写的文件也是utf-8格式的,那么如何读取utf-8的字符串呢?

MultiByteToWideChar/WideCharToMultiByte

顶,谢谢dbger和crybird,我明白utf-8和unicode的转换了,
但是我发现CStdioFile类Write后,保存的文件总是unicode的(以FFFE开头),
请问能不能保存成ascii格式?(我的环境并没有定义unicode)

我的程序如下:
int   test(CString   storeFile)  
{
CStdioFile   dataStore;
CString     somecode;
TCHAR   tbuf[1024]   =   "abc㄃ノ㒃냻 ";
LPTSTR   somecode1   =   tbuf;

BOOL   bIsOk   =   dataStore.Open(storeFile,
CFile::modeCreate  
|   CFile::modeWrite  
|   CFile::shareDenyWrite  
|   CFile::typeText);

if   (!bIsOk)
return   -2;

dataStore.Write(somecode1,   _tcslen(somecode1));
dataStore.Write( "
",   1);
return   0;
}

晕,中文贴不进来啊,再试试

C/C++ code
int test(CString storeFile) { CStdioFile dataStore; CString somecode; TCHAR tbuf[1024] = "abc你我他"; LPTSTR somecode1 = tbuf; BOOL bIsOk = dataStore.Open(storeFile, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyWrite | CFile::typeText); if (!bIsOk) return -2; dataStore.Write(somecode1, _tcslen(somecode1)); dataStore.Write(" ", 1); return 0; }

写到文件中的内容为:
FF FE 61 00 62 00 63 00 63 01 D2 03 3B 03 0D 00
0A 00

可用WideCharToMultiByte 将unicode转换成ansi,但要把前面2个字节0xfeff去掉,否则会有乱码

看看再说

谢谢各位,本人老菜鸟一个,不过总算问题解决了,有点心得,就是CStdioFile类及其ReadString和WriteString方法最好慎用,
我现在用的是CFile和Write/Read。

Tags: , , ,

[ASCII][字符][文件]为什么将ASCII字符输到文件会少字符

05月 13th, 2008 by
Posted in VC/MFC | No Comments »

byte cc[]="你好的他好";
cc[4]=37;
char *dd=(char*)cc;
为什么输出到文本文件会少了个字节呢….

cc[4]=37; 
这是啥意思?

问题是用其它数字代进去是正确的10个字节,,就这个字节少了个字节

引用 3 楼 hollo2 的回复:
问题是用其它数字代进去是正确的10个字节,,就这个字节少了个字节

都说了些啥啊?自己看得懂么?

看看你输出的代码怎么写的吧,

//C4E3BAC3B5C4CBFBBAC3
你好的他好
//C4E3BAC325C4CBFBBAC3
你好%乃?

苍天啊大地啊…

没问题啊,写了11个字节,包括'\0'

C/C++ code
FILE* fp; BYTE cc[]="你好的他好"; cc[4]=37; fp=fopen("test.txt","wb"); fwrite(cc,sizeof(cc),1,fp); fclose(fp);

你用fprintf试一下…

fprintf("%s",cc,fp)

BYTE是一个字节,而汉字是两个字节,
BYTE cc[]="你好的他好"; 

cc[0,1]=“你”; 
cc[2,3]=“好”; 
cc[4,5]=“的”; 
你令cc[4]=37; 
改变了整个字符串后面的值,
所以输出的结果从“你好”之后全是不正确的。

我的意见,不对的请纠正。 

给大家一个提醒…%在字符串里是什么符号

你这是请教还是考人呢?无论你格式化字符对不对,上面代码已经不对了。在一个错误的基础上,你格式化代码再怎么正确也不可能打印合格的字符串来,除非你不想打印字符串,如果这样,那就是你表达能力太差了,把大家都忽悠了,你不是BT的想用%c挨个打印每个字符吧?

引用 12 楼 hollo2 的回复:
给大家一个提醒…%在字符串里是什么符号

再说你知道什么叫ASCII字符么?除了你那个导致错误的ch[4]=37,你列出那些没有一个是ASCII字符,何谓把ASCII输出到文件?

cc被你一改,里面文本根本不是合法的文本,当然输出有问题了
但是再怎么也不该少字节,这应该是你统计字节数的方法有问题

引用 10 楼 hollo2 的回复:
fprintf("%s",cc,fp)

晕..是我被自己忽悠了好吧..忽悠者自忽..

fprintf又怎么不对了?

你好%乃?
C4 E3 BA C3 25 C4 CB FB BA C3 

C/C++ code
FILE* fp; BYTE cc[]="你好的他好"; cc[4]=37; fp=fopen("test.txt","wb"); //fwrite(cc,sizeof(cc),1,fp); fprintf(fp,"%s \r\n",cc); for(int i=0;i<10;i++) fprintf(fp,"%02X ",cc[i]); //输出他们的ASCII码值 fclose(fp);

C/C++ code
FILE* fp; BYTE cc[]="你好的他好"; cc[4]=37; char *dd=(char*)cc; CString str1=cc; fp=fopen("test4.txt","wb"); fprintf(fp,str1); fclose(fp);

Up

Tags: , ,