登录站点

用户名

密码

EVC下UNICODE的字符串的输出问题

已有 1282 次阅读  2011-01-05 09:58   标签style  字符串 

EVC下UNICODE的字符串的输出问题

 

在开发PDA的测图系统中,EVC下的字符串的输出问题困扰了我好几天,在查阅网上相当一部分资料后,总算找到了个解决之道,但今天发现中文字符串却又出现问题,研究了一个下午,弄出了一个比较笨的方法,虽然效率不算高,但目前本人只能想到这样了。

以下是从网上摘抄资料

EVC在某种意义上说,相当于VC的一个子集。因为大多EVC有的功能,VC也具备,而VC有的功能,EVC则不一定拥有。在VC中,操作字符串很方便,因为WINDOWS的字处理能力实在是很强大,它支持多种字符集。我们随便使用一个CString str=“你好”,就要以输入我们想要的中文字符串。在EVC中这种情况有所改变,因为WINCE的字处理能力不够强大,它在处理汉字里统一将它示为UNICODE编码,所以我们在EVC中片理中文字符串时需要用到UNICODE编码。下面结合WINDOWS 下VC字符串的处理,对比一下EVC中文字符串的片理方法。

一、中文字符串定义
1、在VC中我们如果定义一个中文字符串,可以使用CString str=“你好”或LPCTSTR  str=“你好”。
2、在EVC中我们如果想定义一个中文字符串,可以使用如下方法:CString str=_T(“你好”)或者LPCTSTR str=“你好”,这里LPCTSTR在EVC里就是表示UNICODE字符串。值得注意的是_T()宏中,括号中只能填写常量,不能填定变量。
二、字符串操作
1、在VC中我们想拷贝字符串,可以作如下操作:
      char s[20];
      CString str=“你好”;
      strcpy(s,str);
      在EVC中则不能这样做,首先定义中文数组应该用双字节指针wchar_t,而拷贝函数也不能用strcpy,而应该用:wchar_t * wcscpy(wchar_t * wDest,wchar_t wSource);函数,操作如下:
      wchar_t s[20];
      CString str=“你好”;
      wcscpy(s,(LPCTSTR)str); //前面没有转成UNICODE编码,所以这里需要强制转换
2、在VC中我们想在一个字符串中查找某个子串,只需要作下面的操作:
       CString str=“你是一个好学生”;
       str.Find(“学生”);
       在EVC中不能这样做,因为中文字符串为UNICODE编码,我们必需在查找函数的参数里作如下修改:
       str.Find(_T(“学生”));

了解上述基本知识后,先说说我的情况吧,本人的系统由于是个测图系统,设计到点线面的坐标存储和注记(也就是文本)的存储,因为要把已经有的二进制数据存为明码TXT文件,要进行文件操作,本人采用的WIN32的文件操作函数

 

HANDLE hHandle =CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

CString str=L"LineBegin";

WriteFile(hHandle,str,str.GetLength()*sizeof(TCHAR),&cb,NULL);

注意上面的函数,str.GetLenth()*sizeof(TCHAR),因为unicode环境下是用的宽字符,写入的时候要占用双倍的空间,上面的函数本人在向文件写入数字和英文字符串时效果很好,运行也OK。但是在写入汉字时却发现生成的文件中汉字部分全市乱码,且原来格式优美的文本全成了每个字符之间都有一个小空格的情况。

上网找了很多资料,原来EVC下向文件写入中文时必须得把宽字符变成普通的ANSI的字符,采用WideCharToMultiByte()函数能够很好的实现,用该函数将宽字符转换为普通的ANSI字符,不管是中文还是英文抑或是中英混合的都可以很好的写入文件。

    做到这一步,着实把本人高兴了一番,以为问题解决了,可运行程序发现,离成功的道路还很远啊,问题又出现了,因为程序中已经将很多非中文字符串的写入语句都写好了,都是采用的原先的将字符串长度乘以TCHAR的大小实现的,然后再加入后面转换后的中文字符串,发现文本格式还是乱套,虽然没出现乱码,但那格式还是出现那种每个字符间都有个小空格,这让别的程序读取那明码文件肯定会出现问题的。总结了下,也就是说EVC向TXT文件写入字符串时,不能同时写入UNICODE和ANSI字符咯,不知道是否这样。但本人在程序中却发现有点问题很诡异,一直也没弄明白其中缘故。

CString str = L"剑张三丰张放房间打扫test" ;

WriteFile(hHandle,str,str.GetLength()*sizeof(TCHAR),&cb,NULL);

以上两行代码却能将上面的字符串很方便的写入TXT文件中,且格式正确也没有乱码,如果str变量全是汉字的话却又成了乱码,如果中文字符很多的话也变成了乱码,郁闷。这个问题害得我今天比较两个程序费了不少时间。

    最后实在没有办法,看样子只能把所有的字符都转为ANSI格式了,代码看样子得全改了,又要忙了EVC下UNICODE的字符串的输出问题,这个该死的EVC害死我了!

void WriteString(HANDLE hHandle,CString str)
{
 //int len=str.GetLength();
 //wchar_t *wchar;
 //char* s;
 wchar_t wchar[40];
 char s[40];
 DWORD cb;
 wcscpy(wchar,str);
 int nLen=wcslen(wchar)+1;
 int len=WideCharToMultiByte(CP_ACP,0,wchar,-1,s,2*nLen,NULL,NULL);
 WriteFile(hHandle,s,len-1,&cb,NULL);
}

利用该函数就能方便的将一切格式的UNICODE字符转换为ANSI的了,明天开工。

 

注:以上函数代码都是在VS2005 VC++开发智能设备MFC程序中运行通过

上一篇: 用skinmagic给VC6开发的软件换肤 下一篇: 【转】学习VC中所得的点点技术心得[1]

分享 举报