一个字符串包含汉字和字母,如何取得其字节数长度?

时间:2023-01-09 23:15:05
比如:LPTSTR str="hehe,我爱大米"
用_tcslen(str)返回的就是9,那是字符个数,而我想取得其实际字节数,怎么办?  
我在网上看到有人说可以用MultiByteToWideChar转换为Unicode后,再计算其长度, 但MultiByteToWideChar的Code_page设置为什么啊?怎么用?

23 个解决方案

#1


用mbstowcs转换成双字节字符串,然后用wcslen就可以了。

#2


char* cStr;
int mbs;
wchar_t* wStr;
int wcs;
int i = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, cStr, mbs, wStr, wcs);

#3


_tcslen(str)及strlen(str)返回的就是实际字节数,用MultiByteToWideChar返回的是实际的长度
看看以下程序:
LPTSTR str="hehe,我爱大米";
int m=strlen(str);
int n=_tcslen(str);


wchar_t wstr[50];

int k = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, strlen(str), wstr, 50);
CString x;
x.Format("%d %d %d",m,n,k);

MessageBox(x);

#4



楼上的,你说的在VC6.0中测试完全跟你说的一样,返回结果为15,15,11,也就是
str=  "hehe,我爱大米  ";  _tcslen(str)返回的是字节数。

但我的程序是VC++.NET编写,需要设为Unicode配置;在此环境下,_tcslen(str)以及MultiByteWideChar返回值都是11。这还是没把汉字双字节计算进去啊,到底正确的算法是怎么用?

#5


不会这么麻烦吧:CString::GetLength()就行呀

#6


USES_CONVERSION;
lstrlen(W2A(str));

#7


我说的前提是VC++.net,项目属性配置里面的“字符集”设置为“使用Unicode字符集”。
你们的字节用CString::GetString(), _tcslen等,计算中文字符串长度的结果是不对的!

#8


当CString装的是中文时用CString::Left(1)得到的却并不是第一个中文字,使用CString::Left(2)得到第一个中文字,但装的是英文时却得到两个字母,真的让人哭笑不得啊,我怎么样才能得到一个字条串的第一个字,如果是"中文"我就得到'中'字,如果是"china"我就得到'c'?  
 
可能使用STL的base_string<wchar_t>可以解决,但一个编辑框只可以和CString对象绑定啊,怎么进行CString到base_string<wchar_t>的转换呢?  
 
谢谢大家.  
---------------------------------------------------------------  
 
你可以先取一个字符,判断一下ASCII码是否为32到127,如果不是,则取两个字符  
例如:  
有个CString  a;  
CString  temp1;  
temp1=a.Left(1);  
char*  p=temp1.GetBuffer(10);  
if(*p  >=  32  &&  *p  <=127)  
   return  CString  temp1;  
else  
   temp1=a.Left(2);  
---------------------------------------------------------------  
 
saintl(shengliang)  可行,原理是:  
中文字一般是占用两个字节的而且第个字节的ASCII码都是大于127    
 
而英文、英文字符和数字都在32到127之间,所以先判断第一个字节是否在32到127之间,如果不是就再是事大于127,如果大于就把后面的字节也读进来。  
---------------------------------------------------------------  
 
CEdit是从CWnd派生的,比如IDC_EDIT是这个编辑框的ID:  
 
LPTSTR  lpszStr  =  new  char[MAX_LENGTH];  
if  (!lpszStr)  
           return  FALSE;  
 
memset(lpszStr,  0,  MAX_LENGTH);  
CEdit  pEdit  =  (CEdit  *)GetDlgItem(IDC_EDIT);  
pEdit->GetWindowText(lpszStr,  MAX_LENGH);  
 
string  strData  =  lpszStr;  
---------------------------------------------------------------  
 
瞎写的果然有问题,少括号,重新改一下:  
 
CString  MyLeft(CString&s,int  n)  
{  
   CString  sRet="";  
   int  nPos=0;  
   while(nPos<s.GetLength()  &&  n)  
   {  
       if(s.GetAt(nPos)<0){  
           sRet=sRet+s.GetAt(nPos)+s.GetAt(nPos+1);  
           nPos++;  
       }else  
           sRet+=s.GetAt(nPos);  
     nPos++;  
     n--;  
   }  
     return  sRet;  
}  

#9



http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=203528

#10


CString str = "hehe,我爱大米";
int iLength = 0;
for( int i = 0; i < str.GetLength(); )
{
  char c = str.GetAt( i );
  iLength ++;
  if( c >= 0 )
  {// 非汉字
    i += 1;
  }
  else
  {// 汉字
    i += 2;
  }
}

全角字符编码中第一位为1;半角为0。

#11


各位老大,你们的代码全部都只能在非Unicode字符集中管用!
在Unicode字符集环境中,str.GetAt(i)取的是汉字时,其返回值根本不会小于0

#12


我这样写能达到我期望的效果,但不知是否正宗:
LPTSTR str= "hehe,我爱大米";
int nLen=0;
while (*str)
{
  nLen++;
  if(*str & 0xFF80) nLen++; //字节大于127,即非英文字符
  str++;
}

#13


该回复被版主删除

#14


该回复被版主删除

#15


该回复被版主删除

#16


没人能再给点提示吗?
MultiByteToWideChar()函数的正确用法没人知道吗?

#17


用的时候 LPTSTR str=_TEXT("hehe,我爱大米");即用UNICODE
那么,字数为:_tcslen(str)返回的值

#18


我希望得到的是字节数,因为这个LPTSTR str的数据要通过WM_COPYDATA发送给别的程序,
所以要计算其字节数

#19


我没有.net,不过你可试试
LPTSTR str= "hehe,我爱大米";
int n=WideCharToMultiByte(CP_ACP,0,str,-1,NULL,NULL,NULL,NULL);
n 为字长度+1
VC下
LPCWSTR str= L"hehe,我爱大米";
int n=WideCharToMultiByte(CP_ACP,0,str,-1,NULL,NULL,NULL,NULL);


#20


学习中...

#21


转换为char*指针呢?

#22


该回复被版主删除

#23


如果strlen((char*)str)不能返回正确字节数的话,使用WideCharToMultiByte将str转化成MultiByte后再用strlen一定可以,当然如果.net下strlen不能用的话,你用for循环将WideCharToMultiByte得到的结果数到零也数到了

#1


用mbstowcs转换成双字节字符串,然后用wcslen就可以了。

#2


char* cStr;
int mbs;
wchar_t* wStr;
int wcs;
int i = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, cStr, mbs, wStr, wcs);

#3


_tcslen(str)及strlen(str)返回的就是实际字节数,用MultiByteToWideChar返回的是实际的长度
看看以下程序:
LPTSTR str="hehe,我爱大米";
int m=strlen(str);
int n=_tcslen(str);


wchar_t wstr[50];

int k = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, strlen(str), wstr, 50);
CString x;
x.Format("%d %d %d",m,n,k);

MessageBox(x);

#4



楼上的,你说的在VC6.0中测试完全跟你说的一样,返回结果为15,15,11,也就是
str=  "hehe,我爱大米  ";  _tcslen(str)返回的是字节数。

但我的程序是VC++.NET编写,需要设为Unicode配置;在此环境下,_tcslen(str)以及MultiByteWideChar返回值都是11。这还是没把汉字双字节计算进去啊,到底正确的算法是怎么用?

#5


不会这么麻烦吧:CString::GetLength()就行呀

#6


USES_CONVERSION;
lstrlen(W2A(str));

#7


我说的前提是VC++.net,项目属性配置里面的“字符集”设置为“使用Unicode字符集”。
你们的字节用CString::GetString(), _tcslen等,计算中文字符串长度的结果是不对的!

#8


当CString装的是中文时用CString::Left(1)得到的却并不是第一个中文字,使用CString::Left(2)得到第一个中文字,但装的是英文时却得到两个字母,真的让人哭笑不得啊,我怎么样才能得到一个字条串的第一个字,如果是"中文"我就得到'中'字,如果是"china"我就得到'c'?  
 
可能使用STL的base_string<wchar_t>可以解决,但一个编辑框只可以和CString对象绑定啊,怎么进行CString到base_string<wchar_t>的转换呢?  
 
谢谢大家.  
---------------------------------------------------------------  
 
你可以先取一个字符,判断一下ASCII码是否为32到127,如果不是,则取两个字符  
例如:  
有个CString  a;  
CString  temp1;  
temp1=a.Left(1);  
char*  p=temp1.GetBuffer(10);  
if(*p  >=  32  &&  *p  <=127)  
   return  CString  temp1;  
else  
   temp1=a.Left(2);  
---------------------------------------------------------------  
 
saintl(shengliang)  可行,原理是:  
中文字一般是占用两个字节的而且第个字节的ASCII码都是大于127    
 
而英文、英文字符和数字都在32到127之间,所以先判断第一个字节是否在32到127之间,如果不是就再是事大于127,如果大于就把后面的字节也读进来。  
---------------------------------------------------------------  
 
CEdit是从CWnd派生的,比如IDC_EDIT是这个编辑框的ID:  
 
LPTSTR  lpszStr  =  new  char[MAX_LENGTH];  
if  (!lpszStr)  
           return  FALSE;  
 
memset(lpszStr,  0,  MAX_LENGTH);  
CEdit  pEdit  =  (CEdit  *)GetDlgItem(IDC_EDIT);  
pEdit->GetWindowText(lpszStr,  MAX_LENGH);  
 
string  strData  =  lpszStr;  
---------------------------------------------------------------  
 
瞎写的果然有问题,少括号,重新改一下:  
 
CString  MyLeft(CString&s,int  n)  
{  
   CString  sRet="";  
   int  nPos=0;  
   while(nPos<s.GetLength()  &&  n)  
   {  
       if(s.GetAt(nPos)<0){  
           sRet=sRet+s.GetAt(nPos)+s.GetAt(nPos+1);  
           nPos++;  
       }else  
           sRet+=s.GetAt(nPos);  
     nPos++;  
     n--;  
   }  
     return  sRet;  
}  

#9



http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=203528

#10


CString str = "hehe,我爱大米";
int iLength = 0;
for( int i = 0; i < str.GetLength(); )
{
  char c = str.GetAt( i );
  iLength ++;
  if( c >= 0 )
  {// 非汉字
    i += 1;
  }
  else
  {// 汉字
    i += 2;
  }
}

全角字符编码中第一位为1;半角为0。

#11


各位老大,你们的代码全部都只能在非Unicode字符集中管用!
在Unicode字符集环境中,str.GetAt(i)取的是汉字时,其返回值根本不会小于0

#12


我这样写能达到我期望的效果,但不知是否正宗:
LPTSTR str= "hehe,我爱大米";
int nLen=0;
while (*str)
{
  nLen++;
  if(*str & 0xFF80) nLen++; //字节大于127,即非英文字符
  str++;
}

#13


该回复被版主删除

#14


该回复被版主删除

#15


该回复被版主删除

#16


没人能再给点提示吗?
MultiByteToWideChar()函数的正确用法没人知道吗?

#17


用的时候 LPTSTR str=_TEXT("hehe,我爱大米");即用UNICODE
那么,字数为:_tcslen(str)返回的值

#18


我希望得到的是字节数,因为这个LPTSTR str的数据要通过WM_COPYDATA发送给别的程序,
所以要计算其字节数

#19


我没有.net,不过你可试试
LPTSTR str= "hehe,我爱大米";
int n=WideCharToMultiByte(CP_ACP,0,str,-1,NULL,NULL,NULL,NULL);
n 为字长度+1
VC下
LPCWSTR str= L"hehe,我爱大米";
int n=WideCharToMultiByte(CP_ACP,0,str,-1,NULL,NULL,NULL,NULL);


#20


学习中...

#21


转换为char*指针呢?

#22


该回复被版主删除

#23


如果strlen((char*)str)不能返回正确字节数的话,使用WideCharToMultiByte将str转化成MultiByte后再用strlen一定可以,当然如果.net下strlen不能用的话,你用for循环将WideCharToMultiByte得到的结果数到零也数到了