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

老开山 2005-04-13 06:25:23
比如:LPTSTR str="hehe,我爱大米"
用_tcslen(str)返回的就是9,那是字符个数,而我想取得其实际字节数,怎么办?
我在网上看到有人说可以用MultiByteToWideChar转换为Unicode后,再计算其长度, 但MultiByteToWideChar的Code_page设置为什么啊?怎么用?
...全文
1306 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2005-04-16
  • 打赏
  • 举报
回复
转换为char*指针呢?
bluebohe 2005-04-16
  • 打赏
  • 举报
回复
如果strlen((char*)str)不能返回正确字节数的话,使用WideCharToMultiByte将str转化成MultiByte后再用strlen一定可以,当然如果.net下strlen不能用的话,你用for循环将WideCharToMultiByte得到的结果数到零也数到了
horisly 2005-04-15
  • 打赏
  • 举报
回复
学习中...
柯本 2005-04-15
  • 打赏
  • 举报
回复
我没有.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);


老开山 2005-04-15
  • 打赏
  • 举报
回复
我希望得到的是字节数,因为这个LPTSTR str的数据要通过WM_COPYDATA发送给别的程序,
所以要计算其字节数
NOMADBLUE 2005-04-15
  • 打赏
  • 举报
回复
用的时候 LPTSTR str=_TEXT("hehe,我爱大米");即用UNICODE
那么,字数为:_tcslen(str)返回的值
老开山 2005-04-15
  • 打赏
  • 举报
回复
没人能再给点提示吗?
MultiByteToWideChar()函数的正确用法没人知道吗?
vcmute 2005-04-14
  • 打赏
  • 举报
回复
USES_CONVERSION;
lstrlen(W2A(str));
老开山 2005-04-14
  • 打赏
  • 举报
回复
我这样写能达到我期望的效果,但不知是否正宗:
LPTSTR str= "hehe,我爱大米";
int nLen=0;
while (*str)
{
nLen++;
if(*str & 0xFF80) nLen++; //字节大于127,即非英文字符
str++;
}
老开山 2005-04-14
  • 打赏
  • 举报
回复
各位老大,你们的代码全部都只能在非Unicode字符集中管用!
在Unicode字符集环境中,str.GetAt(i)取的是汉字时,其返回值根本不会小于0
shangke_sks 2005-04-14
  • 打赏
  • 举报
回复
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。
handwolf 2005-04-14
  • 打赏
  • 举报
回复

http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=203528
handwolf 2005-04-14
  • 打赏
  • 举报
回复
当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;
}
老开山 2005-04-14
  • 打赏
  • 举报
回复
我说的前提是VC++.net,项目属性配置里面的“字符集”设置为“使用Unicode字符集”。
你们的字节用CString::GetString(), _tcslen等,计算中文字符串长度的结果是不对的!
svod5306 2005-04-13
  • 打赏
  • 举报
回复
不会这么麻烦吧:CString::GetLength()就行呀
老开山 2005-04-13
  • 打赏
  • 举报
回复

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

但我的程序是VC++.NET编写,需要设为Unicode配置;在此环境下,_tcslen(str)以及MultiByteWideChar返回值都是11。这还是没把汉字双字节计算进去啊,到底正确的算法是怎么用?
柯本 2005-04-13
  • 打赏
  • 举报
回复
_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);
yhz 2005-04-13
  • 打赏
  • 举报
回复
char* cStr;
int mbs;
wchar_t* wStr;
int wcs;
int i = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, cStr, mbs, wStr, wcs);
yhz 2005-04-13
  • 打赏
  • 举报
回复
用mbstowcs转换成双字节字符串,然后用wcslen就可以了。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧