C#写的WebService,姓名是byte[]长度40 中文 用Encoding.Unicode.GetByte转的.C#中控制了长度最大20
VC.NET 2005 用ATLSOAP_BLOB接的.之后用 memcpy将复制到char Name[40]中.
这时候,直接将char Name[40]放到CString中,并且显示到static text中是一切正常的.
CString.Format(_T("%s"),Name);
问题出现在将char Name[40]用CFile存到文件以后,再取出来.
给CString的时候就出问题了.而且有之后转换的时候.char Name[40]里面都是中文就没问题
当有英文时,Encoding.Unicode.GetByte把英文转换后另外会留下一个\0但是%s就以\0结束了.还有用大写的%S也有问题
把部分代码贴出来希望大家帮忙.
我主要做C#的.不太了解VC.NET,还请多多包含.谢谢大家
另外以前也试过WChar也失败了.主要原因个人怀疑是文件存取后编码问题.
谢谢各位高手
- C/C++ code
//1.首先,接收webservice的结构体struct WS_PERSON{ int PID; ATLSOAP_BLOB ID; ATLSOAP_BLOB SerialNumber; ATLSOAP_BLOB Name; WS_DATE EnrollmentDate; WS_DATE Birthday; BSTR Photo; ATLSOAP_BLOB Address; ATLSOAP_BLOB Telephone; unsigned char Type; unsigned char State; ATLSOAP_BLOB MagcardNumber; unsigned char MagcardState; int Version; int PhotoVersion;};//2.存取文件和显示的结构体// 学生或教师信息typedef struct _VCT_PERSON{ int Id; // 编号 char Key[36]; // 唯一标识 char Code[20]; // 学号或工号// WCHAR Name[20]; // 姓名 char Name[40]; // 姓名 VCT_DATA EnrollmentDate; // 入学时间 VCT_DATA Birthday; // 生日 WCHAR Photo[200]; // 照片地址 // WCHAR Address[50]; // 地址 char Address[100]; // 地址 uchar Phone[20]; // 电话 char Type; // 学生/教师 char State; // 学生状态 char CardId[16]; // 卡号 char CardState; // 卡号状态 int Grade; // 年级 int Class; // 班级 int Version; // 数据版本 int PhotoVersion; // 图片版本}VCT_PERSON,*LPVCT_PERSON;//3.两个结构体赋值的方法void ConvertToPerson(VCT_PERSON* dest,WS_PERSON* src){ // 编号 dest->Id=src->PID; // 唯一标识 memcpy(dest->Key,src->ID.data,src->ID.size); // 学号/工号 memcpy(dest->Code,src->SerialNumber.data,src->SerialNumber.size); // 姓名 //_tcscpy(dest->Name,src->Name); memset(dest->Name,0,sizeof(dest->Name)); memcpy(dest->Name,src->Name.data,src->Name.size); // 入学日期 memcpy(&dest->EnrollmentDate,&src->EnrollmentDate,sizeof(dest->EnrollmentDate)); // 生日 memcpy(&dest->Birthday,&src->Birthday,sizeof(dest->Birthday)); // 照片地址 _tcscpy(dest->Photo,src->Photo); // 联系地址 //_tcscpy(dest->Address,src->Address); memset(dest->Address,0,sizeof(dest->Address)); memcpy(dest->Address,src->Address.data,src->Address.size); // 联系电话 memcpy(dest->Phone,src->Telephone.data,src->Telephone.size); // 人物类型 dest->Type=src->Type; // 学生/教师状态 dest->State=src->State; // 卡号 memcpy(dest->CardId,src->MagcardNumber.data,src->MagcardNumber.size); // 卡状态 dest->CardState=src->MagcardState; // 年级 dest->Grade=0; // 班级 dest->Class=0; // 数据版本 dest->Version=src->Version; // 照片版本 dest->PhotoVersion=src->PhotoVersion;}//4.存取文件的方法//存BOOL CDBManager::SavePersonData(){ printf("[CDataManger::SavePersonData]\n"); CFile file; if(!file.Open(PERSON_DB,CFile::modeCreate|CFile::modeReadWrite,NULL)) { printf("[CDataManger::SavePersonData] open file failed!\n"); return false; } int count=Persons.GetSize();//Persons是VCT_PERSON的一个列表,CPtrArray类型 VCT_PERSON* p; for (int i=0;i<count;i++) { p=(VCT_PERSON*)Persons.GetAt(i); file.Write(p,sizeof(VCT_PERSON)); } file.Close(); return true;}//取BOOL CDBManager::GetPersonData(VCT_PERSON* & data,int & dwsize){ printf("[CDataManger::GetPersonData]\n"); CFile file; if(!file.Open(PERSON_DB,CFile::modeRead,NULL)) { printf("[CDataManger::GetPersonData] open file failed!\n"); return false; } int filelen; filelen=(int)file.GetLength(); if((filelen%sizeof(VCT_PERSON))!=0) { printf("[CDataManger::GetPersonData] file is ruinate!\n"); return false; } dwsize=filelen/sizeof(VCT_PERSON); data=(VCT_PERSON* )malloc(filelen); memset(data,0,filelen); int rcount=0; while(rcount<filelen) { rcount+=file.Read(&data[rcount],filelen-rcount); } file.Close(); return true;}//4.给CString的赋值CString m_Person_Name;m_Person_Name.Format(_T("%s"),m_Person->Name);