用_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);
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);
看看以下程序:
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));
lstrlen(W2A(str));
#7
我说的前提是VC++.net,项目属性配置里面的“字符集”设置为“使用Unicode字符集”。
你们的字节用CString::GetString(), _tcslen等,计算中文字符串长度的结果是不对的!
你们的字节用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;
}
可能使用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
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。
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
在Unicode字符集环境中,str.GetAt(i)取的是汉字时,其返回值根本不会小于0
#12
我这样写能达到我期望的效果,但不知是否正宗:
LPTSTR str= "hehe,我爱大米";
int nLen=0;
while (*str)
{
nLen++;
if(*str & 0xFF80) nLen++; //字节大于127,即非英文字符
str++;
}
LPTSTR str= "hehe,我爱大米";
int nLen=0;
while (*str)
{
nLen++;
if(*str & 0xFF80) nLen++; //字节大于127,即非英文字符
str++;
}
#13
#14
#15
#16
没人能再给点提示吗?
MultiByteToWideChar()函数的正确用法没人知道吗?
MultiByteToWideChar()函数的正确用法没人知道吗?
#17
用的时候 LPTSTR str=_TEXT("hehe,我爱大米");即用UNICODE
那么,字数为:_tcslen(str)返回的值
那么,字数为:_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);
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);
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);
看看以下程序:
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));
lstrlen(W2A(str));
#7
我说的前提是VC++.net,项目属性配置里面的“字符集”设置为“使用Unicode字符集”。
你们的字节用CString::GetString(), _tcslen等,计算中文字符串长度的结果是不对的!
你们的字节用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;
}
可能使用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
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。
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
在Unicode字符集环境中,str.GetAt(i)取的是汉字时,其返回值根本不会小于0
#12
我这样写能达到我期望的效果,但不知是否正宗:
LPTSTR str= "hehe,我爱大米";
int nLen=0;
while (*str)
{
nLen++;
if(*str & 0xFF80) nLen++; //字节大于127,即非英文字符
str++;
}
LPTSTR str= "hehe,我爱大米";
int nLen=0;
while (*str)
{
nLen++;
if(*str & 0xFF80) nLen++; //字节大于127,即非英文字符
str++;
}
#13
#14
#15
#16
没人能再给点提示吗?
MultiByteToWideChar()函数的正确用法没人知道吗?
MultiByteToWideChar()函数的正确用法没人知道吗?
#17
用的时候 LPTSTR str=_TEXT("hehe,我爱大米");即用UNICODE
那么,字数为:_tcslen(str)返回的值
那么,字数为:_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);
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得到的结果数到零也数到了