我最近碰到一个难题:
用strlen()来计算含有中文的字符串,会把一个中文字符算作两个;
有个wcslen()函数,不知可不可以,目前我还不会用!
请高手们指教!!!
用strlen()来计算含有中文的字符串,会把一个中文字符算作两个;
有个wcslen()函数,不知可不可以,目前我还不会用!
请高手们指教!!!
解决方案 »
- 高分求助,还是关于红绿灯显示的问题,
- CDialogBar的派生类的OnPaint函数里,为何BitBlt有效而Rectangle无效?
- 刚开始学习C++, 有很多东西不懂,请高手指教.
- 编译通过了,但运行是出错,为什么??CFileDialog::GetFolderPath()
- 这么简单个hook怎么返回值总是NULL?
- 急问!
- 求救 vc下用spi实现sniffer
- 请大家给个方案好么。我要做一个同时显示多张图片的程序,如何做呢,我现在连如何显示一张图片都不知道如何做呢。
- 征询IP包转发器,和转发原理。(高手请指教,急)
- 晕倒!这么简单的程序,VC++居然报编译错误!
- csdn的服务器是否运行的太慢了
- 请问加密算法问题
{
printf("wcslen(L\"Hello 中国!\")=%d\n",wcslen(L"Hello 中国!"));
}//输出:wcslen(L"Hello 中国!")=9
//注意:语句中的“L”非常必要
int StrLen( const char *str )
{
int iLen = 0;
while( *(str+iLen) )
{
if( *(str+iLen) < 0 ) iLen += 2; //汉字
iLen++;
}
return iLen;
}
//这仅仅是一个简单的例子,具体可以更优化一些,但也应该考虑得更多一些。
1st byte 2nd byte
0x81~0xfe 0x40~0x7e and 0x80~0xfeBIG5范围:
1st byte 2nd byte
0x81~0xfe 0x40~0x7e and 0xa1~0xfe
如果不行就自己写一个吧,算法比较简单的。GetHZStringLen(const char* pStr)
{
BOOL bHZ = FLASE;
UINT nLen = 0;
UINT i = 0;
while(pStr[i] != 0){
if(pStr[i] >= 127){
if(bHZ){
nLen ++;
bHZ = FALSE;
}
else{
bHZ = TRUE;
continue;
}
}
else{
nLen ++;
} }
return nLen;
}
GetHZStringLen(const char* pStr)
{
BOOL bHZ = FLASE;
UINT nLen = 0;
UINT i = 0;
while(pStr[i++] != 0){
if(pStr[i] >= 127){
if(bHZ){
nLen ++;
bHZ = FALSE;
}
else{
bHZ = TRUE;
continue;
}
}
else{
nLen ++;
} }
return nLen;
}
如:
char strbuf[256];
strcpy(strbuf,"中国007");
wcslen(strbuf);//这句有问题编译时通不过,那该怎样使用??
请教:我测试了一下你的小程序:
int StrLen( const char *str )
{
int iLen = 0;
while( *(str+iLen) )
{
if( *(str+iLen) < 0 ) iLen += 2; //汉字
iLen++;
}#include <windows.h>
#include <stdio.h>
#include <iostream.h>
void main()
{
char str[]="三带你三点带点dsfsdahfsh";
int iLen = 0;
while( *(str+iLen) )
{
if( *(str+iLen) < 0 )
{
printf("%d\n",*(str+iLen));
iLen += 2;//汉字
}
iLen++;
}
printf("%d\n",*(str+iLen));
printf("%d\n",iLen);
} return iLen;
}
输出如下:
-56
-8
-56
-29
-75
0
24
结果是对的
但我对其中中间输出的负数不清楚它的真正含义
望解释
char strbuf[256];
wchar_t str[256];
strcpy(strbuf,"中国007");
swprintf(str,"%s",strbuf);//此句有错误
wcscpy(str,L"中国007");//重申“L”很重要
wcscpy(str,L"中国007");//重申“L”很重要
int d = wcslen(str);这样就对了swprintf(str,"%s",strbuf);//像这样把char和wchar_t混用当然有错。char和wchar_t是不同的类型,分别对应各自的操作函数,不要用混了。
#define _UNICODE USES_CONVERSION;//must
char *buf=NULL;
wchar_t *pwbuf=NULL; buf=(LPSTR)(LPCTSTR)sFieldName;
pwbuf=A2W(buf);
hr=pContentHandler->startElement(L"",0,pwbuf,wcslen(pwbuf),pwbuf,wcslen(pwbuf),NULL);
CString sFieldName="你是中国人吗?Shit";
"L'是很重要,但要是该函数的两个参数都是变量,那么这个“L"怎么加?
如:
wcscpy(str0,str1);
//其中str1是从文件中读取的字符串请指教。
#include <atlbase.h>char *b="Hello,中国人";
wchar_t *a=new wchar_t[strlen(b)*2+1];
wcscpy(a, A2BSTR(b));
int i=wcslen(a);
delete []a;
int i=wcslen(A2BSTR(b));
CString str="中国1";
int i=_mbslen((const unsigned char *)(LPCTSTR(str)));
(2)
char *str="中国1";
int i=_mbslen((const unsigned char *)(str));
你的方法确实蛮好,那我有点不清楚了,_mbs打头的一系列函数与wcscpy等一系列函数有说明不同。