字符串转换:wchar_t MultiByteToWideChar Unicode等

时间:2021-06-28 20:16:47
T: 关于unicode,把包含中文的CString的各个char取出来
Q: CString str="12ab大小";

用什么方法能转变成下面的形式
char ch(20);

ch(1)="1";
ch(2)="2";
ch(3)="a";
ch(4)="b";
ch(5)="大";
ch(6)="小";
A: 有点乱
定义数组应该用char ch[20];
字符赋值应该用ch[0]='1';ch[1]='2';用单引号
注意中文是两个char的长度,是不能用ch[4]='大';的
我这里有一个在不同的代码页下边里字符串里面的字的小程序,你看一下
int main(int argc, char* argv[])
{
 char *str="abc中文字符def";
 char *p=str,*p1;
 unsigned short ch;
 while(strcmp(p,"")!=0)
 {
  p1=CharNextExA(1250,p,0);
  int i=p1-p;
  if(i==1)
  {
   ch=(unsigned char)*p;
  }else if(i==2)
  {
   ch=(*p)*256+*(p+1);
  }
  p=p1;

  {
  }
 }
 return 0;
}

T: 有关VARIANT的问题
Q: 请问如何把VARIANT类型转化成cstring;它的具体用法到底如何?有没有详细的文章和实力?谢谢,谢谢。
A:
这样子,一个例子,我觉得还是CString类型比较好用,所以我一般都转成CString类型后再进一步处理
CString str="";
_variant_t var;
var=m_pRecordSet->GetCollect("姓名");
if(var.vt!=VT_NULL)
str=(LPCTSTR)(_bstr_t)var;
else
str="";
………………
T: 怎样把CString转换成_variant_t? 
Q: 1.在ado操作中,怎么样把CString转换成_variant_t?请给出例子,谢谢!

  2.

  CString s;
  LPTSTR temp=(LPTSTR)(LPCTSTR)s;
以上两句运行时出错,跟踪进去到此处:
  _AFX_INLINE CString::operator LPCTSTR() const
 { return m_pchData; }
请问是怎么回事?
A: 1:
CString str="sdafkljjksafd";
_variant_t str1((LPCTSTR)str);
2:
如果仅仅是这么两句就出问题的话,应该是你的s没有初始化的缘故
T: 怎么从 _bstr_t 型的字符串中取出想要的子串 
Q: _bstr_t aaa="PATHNAME_E4M6Q2I8"
现在我想要
bbb="M6Q2I8"
请问大虾,有什么函数可以从aaa 得到 bbb,谢谢
A: _bstr_t aaa="PATHNAME_E4M6Q2I8"
CString aaa1=(LPCTSTR)aaa;
CString bbb1=aaa1.Right(6);
_bstr_t bbb=(_bstr_t)(LPCTSTR)bbb1;
呵呵,实现繁了点,看看楼下有没有好一些的方法
T: CString类型长度问题,急 
Q: CString str="字a符b汉字2";
怎样能得出这个字符串的长度是7/
即一个汉字算一个,一个字母或数字算一个
A: CString str("字a符b汉字2");
BSTR bstr = str.AllocSysString();
int a=wcslen(bstr);
T: 一个菜问题:如何把char[]标准串转换成BSTR 
Q:
好像可以用如:L"test"转(例程中看到的),但找不到“L”是个什么东东 :(
若有:

char szTmp[128];
sprintf(szTmp,"test");

如何将szTmp转成BSTR呢?

菜问题请教DX了!
A:  char szTmp[128];
 sprintf(szTmp,"test");
 CString str=szTmp;
 BSTR str1=str.AllocSysString();
 ::SysFreeString(str1);
T: 那位大虾告诉我如何在程序中将UTF-8编码转换为ANSI,马上结贴
Q: 那位大虾告诉我如何在程序中将UTF-8编码转换为ANSI,马上结贴!!!!!
A: #include "Windows.h"

int main(void)
{
 char str[256]={0xE4, 0xBD, 0xA0, 0xE5 ,0xA5 ,0xBD, 0x61, 0x62 ,0x63,0} ; 
 unsigned short int strA[256];
 MultiByteToWideChar(CP_UTF8,0,(char*)str,-1,strA,256);

 WideCharToMultiByte(CP_ACP,0,strA,-1,str,256,NULL,NULL);
 return 0;
}
T: 各位高手的大讨论(请看这段代码有什么错)参与者有分,请各位发表观点
Q: LPWSTR AnsiToUnicode(LPCSTR lpcstr)   //参数lpcstr类型也可是char*
{
    LPWSTR Pwstr;
    int  Cb,i;
    Cb=strlen(lpcstr)*sizeof(LPCSTR);
    Pwstr=LocalAlloc(LMEM_FIXED,Cb);
 
    i=MultiByteToWideChar(CP_ACP,0,lpcstr,-1,Pwstr,0);
    MultiByteToWideChar(CP_ACP,0,lpcstr,-1,Pwstr,i);

 return (Pwstr);
}
函数功能:将ANSI转换成UNICODE:问题如下:

1:首先此函数运行正常,但有一个缺点(个人观点),那就是在用  Cb=strlen(lpcstr)*sizeof(LPCSTR);函数分配固定内存时,多分配了内存,造成内存浪费。个人认为:应这样写Cb=2*(strlen(lpcstr)+1);
不知有错没有,请各位指教。
2:如果Cb=strlen(lpcstr);这样程序照样运行正常,但实际上分配的固定内存并不够,不够的部分占用了堆中其它未用的内存快。这部分内存快很容易被其他人分配用掉,所以Pwstr值很有可能会被冲掉(冲掉的是未够分配的内存)。
不知以上分析的对不对,请各位指教
A: LPWSTR AnsiToUnicode(char* lpcstr)   //参数lpcstr类型也可是char*
{
    LPWSTR Pwstr;
    int  i;
    i=MultiByteToWideChar(CP_ACP,0,lpcstr,-1,NULL,0);
    Pwstr=new WCHAR[i];
    MultiByteToWideChar(CP_ACP,0,lpcstr,-1,Pwstr,i);
 
     return (Pwstr);
}

顺便说一下,你这种在程序内部new、外部释放的做法如果不明显说明的话非常容易引起内存泄漏!
T: 请问Unicode和编码的转换问题.100分,不成敬意. 
Q: 请问Unicode的汉字和编码制的转换.还包括两种代码的转换
分为两部分:
1.我有 554A 这个码,怎么显示出"啊"字.
2.就是反向的问题了.

我刚刚接触到Unicode.一窍不通,请各位详细指点.多谢!多谢
另外我是在标准C下作的,所以所涉及到的编译条件什么的,也请指点.
A: 554A 确实是啊的UNICODE编码,这样转换
#include <comdef.h>
 WCHAR* str1=L"啊dsfa";//一个UNICODE字符串
_bstr_t str2=str1;
char* str=str2;//str3就是普通字符串

反过来也一样
char* str3="啊dsfa";//普通字符串
_bstr_t str2=str3;
WCHAR* str1=str2;