Unicode/not set/multi-byte/部分常用函数

本文介绍了字符编码的基础概念,包括多字节与Unicode编码的区别及应用。详细探讨了TCHAR宏的作用,以及如何在不同编码环境下使用合适的字符串处理函数,如_lstrcpy、wcslen等,并给出了在Visual Studio 2005和WinCE6.3环境中处理字符串的具体实例。

字符编码

      两种字符类型 char  / wchar_t

      TCHAR是一个宏

                                   多字节编码时:替换为char

                                   Unicode编码时:替换为wchar_t

l      不能使用strcpy这样的ANSI C字符串函数处理wchar_t字符串,须使用wcs前缀的函数。

l      为了使编译器识别Unicode字符串,在字符串前面加L前缀。

wchar_t *szTest = L”This is a Unicode string”;

l      使用TCHAR: 不应该使用ANSIstrxxxUnicodewcsxxx 须使用Tchar.h中定义的_tcsxxx,并用_TEXT代替L

l       

函数

*     _tcslwr 将字符串转化成小写字母(VS2005+WinCE6.3

*     lstrcpy 复制(VS2005+WinCE6.3

Cstring TCHAR

TCHAR之间的复制

lstrcpy(TCHAR  , TCHAR);

lstrcpy(TCHAR  , CString);

      CString str= _T("VS");

       printf("str.getlength()=%d/n",str.GetLength()); //Unicode3个字符  //not set 4个字节。//mult 4//not set ==mult??

       int a;

       a=wcslen(str);

       printf("a=%d/n",a);//3

       a=_tcslen(str);

       printf("a=%d/n",a);//3

 

       TCHAR tstr[10];

       a=wcslen(tstr);printf("a=%d/n",a);//1  

       lstrcpy(tstr,str);

       a=wcslen(tstr);printf("a=%d/n",a);//3

 

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、winbase.h

#define lstrcpyW wcscpy

#ifdef UNICODE

#define lstrcpy lstrcpyW

#else

#define lstrcpy lstrcpyA

#endif

、、、、、、、、、、、、、、、、、、、、、、、、、、、tchar.h

#define _tcscpy         wcscpy

 

 

*     wsprintf 复制(VS2005+WinCE6.3

TCHAR *CurrentPath;

TCHAR CurrentFullPath[MAX_PATH];

wsprintf(CurrentFullPath,TEXT("%ls//*.*"),CurrentPath);

 

winbase.h中:

#ifdef UNICODE

#define wsprintf wsprintfW

#else

#define wsprintf wsprintfA

#endif

 

*     wcslen 获取字符串长度(环境VS2005

if(0==wcslen(CurrentPath)){};

wcslen(CString)multi-byte/not set字符集编译错误

cannot convert parameter 1 from 'CString' to 'const wchar_t *'

Unicode字符集正确,返回字符数。同Cstring.GetLength();

#define _tcslen         wcslen //tchar.h

_tcslen  multi-byte/not set/Unicode均可以用,在Unicode下返回字符数,在multi-byte/not set下返回字节数。

以上结果在PC上得出,

wince6.3版本在multi-byte/not set 情况下报错,只能用Unicode,应该与所有SDK有关。

WinCE6.3 +Unicode:

Cstring str=_T(VS);

wcslen(str)==_tcslen(str)==str.GetLength()==3

strlen(str):报错,

cannot convert parameter 1 from 'CString' to 'const char *'

 

*     wmemcmp比较字符串 VS2005+WinCE6.3

if(wmemcmp(FolderName,_T("//网络"),wcslen(FolderName))==0){// 等于零代表想同}

*     _wcsuper 字符串小写换为大写(VS2005+WinCE6.3

TCHAR *FileName;

//赋值

TCHAR *UpperFileName =_wcsupr(FileName);

*      

*      字符集转化函数

MultiByteToWideChar

        WideCharToMultiByte

        LCMapString (简体与繁体转化)

 

 

 

悲催的,脑袋僵的很,明明知道Unicode一个字符两个字节,还一直想怎么获取一个CString 的字节数!    字符数*2!!!!弱弱弱

分析报错:[0825 11:11:57.913][evo-event][OperatorLogAspect:doAround:100][http-nio-8919-exec-7][ERROR] UUID[7e3dbe07ddd94372be5264af3151fa80]method[alarm/types/page][报警类型分页查询],system error:[ ### Error querying database. Cause: dm.jdbc.driver.DMException: 第 2 行, 第 518 列[using]附近出现错误: 语法分析出错 ### The error may exist in URL [jar:file:/opt/evo/evo-common/evo-event/evo-event.jar!/mapper/alarmPlan/EventAlarmTypeMapper.xml] ### The error may involve com.dahua.evo.event.business.mapper.alarmPlan.EventAlarmTypeMapper.selectPage_COUNT ### The error occurred while executing a query ### SQL: /*dialect*/select count(0) from ( /*dialect*/select et.ID, en.ALARM_TYPE_NAME, et.ALARM_TYPE, wm_concat(ea.AFFILIATION_NAME) as AFFILIATION_NAME , et.STATUS, et.ALARM_GRADE, et.ALARM_STORM, sum(et.USER_DEFINED) as USER_DEFINED , et.IS_SAVE, et.FAILURE, et.URL_NAME_KEY from event_alarm_type as et inner join event_alarm_type_name as en on et.ALARM_TYPE = en.ALARM_TYPE inner join event_alarm_type_affiliation as ea on et.AFFILIATION = ea.AFFILIATION where en.LANGUAGE = ? and ea.LANGUAGE = ? group by et.ALARM_TYPE order by convert(ALARM_TYPE_NAME using gbk) desc ) tmp_count ### Cause: dm.jdbc.driver.DMException: 第 2 行, 第 518 列[using]附近出现错误: 语法分析出错 ; bad SQL grammar []; nested exception is dm.jdbc.driver.DMException: 第 2 行, 第 518 列[using]附近出现错误: 语法分析出错],timeout[18]ms org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: dm.jdbc.driver.DMException: 第 2 行, 第 518 列[using]附近出现错误: 语法分析出错 ### The error may exist in URL [jar:file:/opt/evo/evo-common/evo-event/evo-event.jar!/mapper/alarmPlan/EventAlarmTypeMapper.xml] ### The error may involve com.dahua.evo.event.business.mapper.alarmPlan.EventAlarmTypeMapper.selectPage_COUNT ### The error occurred while executing a query ### SQL: /*dialect*/select count(0) from ( /*dialect*/select et.ID, en.ALARM_TYPE_NAME, et.ALARM_TYPE, wm_concat(ea.AFFILIATION_NAME) as AFFILIATION_NAME , et.STATUS, et.ALARM_GRADE, et.ALARM_STORM, sum(et.USER_DEFINED) as USER_DEFINED , et.IS_SAVE, et.FAILURE, et.URL_NAME_KEY from event_alarm_type as et inner join event_alarm_type_name as en on et.ALARM_TYPE = en.ALARM_TYPE inner join event_alarm_type_affiliation as ea on et.AFFILIATION = ea.AFFILIATION where en.LANGUAGE = ? and ea.LANGUAGE = ? group by et.ALARM_TYPE order by convert(ALARM_TYPE_NAME using gbk) desc ) tmp_count ### Cause: dm.jdbc.driver.DMException: 第 2 行, 第 518 列[using]附近出现错误: 语法分析出错 ; bad SQL grammar []; nested exception is dm.jdbc.driver.DMException: 第 2 行, 第 518 列[using]附近出现错误:
最新发布
08-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值