各位同学好!咨询一个编码的问题! 本帖最后由 oloveuxyz 于 2011-01-13 12:17:39 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 MultiByteToWideChar(CP_UTF8,WideCharToMultiByte(CP_ACP 做编码转化,WideCharToMultiByte/MultiByteToWideChar(); 直接加载sqlite3.c和sqlite3.h不就行了么?我就是这么直接使用的,没见不行啊 //***************Ansi转化为UTF-8*******************// int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szSrc, strlen(szSrc), NULL, 0); //分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间 wchar_t* wszString = new wchar_t[wcsLen + 1]; //转换 ::MultiByteToWideChar(CP_ACP, NULL, szSrc, strlen(szSrc), wszString, wcsLen); //最后加上'\0' wszString[wcsLen] = '\0'; int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL); //同上,分配空间要给'\0'留个空间 //UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存 char* szU8 = new char[u8Len + 1]; //转换 //unicode版对应的strlen是wcslen ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), szU8, u8Len, NULL, NULL); sqlite3_open只有这个需要UTF-8其它的都无所谓 Vc里使用UTF8很复杂,很难吗?或者说VC使用utf8有哪些不方便的地方?----------------------------------------------------------那得看具体情况了。首先,你得清楚VC中Ansi、Unicode、UTF8编码的编码方式:Ansi字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个\0结尾,常用于txt文本文件 Unicode字符串,每个字符(汉字、英文字母)都占2个字节,以2个连续的\0结尾,而UTF8是Unicode一种压缩形式,比如英文A在unicode中表示为0x0041,但这种存储方式太浪费,因为浪费了50%的空间,于是就把英文压缩成1个字节,成了utf8编码,但是汉字在utf8中占3个字节,显然用做中文不如ansi合算例如对文本进行读写操作的时候,就得看文本内容是英文还是中文,或者中英文等,根据不同编码对中英字符所占长度的不同,选择不同的编码。当然,现如今,你也不必非要考虑这些细节问题 sqlite好像只支持UTF8格式编码吧 好像只sqlite3_open 需要UTF-8吧 UTF-8大了可不是一点半点嵌入式的DBMS呢 SGIP发送长短信 【急切求助】关于ARP局域网攻击程序的Bug.... 为什么我的程序无法接获系统的关机消息? 请教文件操作类CFile的一个问题 大家认为,迄今为止哪个版本的Visual Assist或Visual Assist X最稳定啊? google又被封掉了? 快帮我看看 请教高手,我在一个工程中使用另外一个工程时出现了几个2001错误,该包含的我都包含了,详细错误信息,请进,来者有分,谢谢 关于调用插件里的方法的问题 为何包含了<afxinet.h>就不能用<winsock2.h>?两者有冲突么? 在文档中操作视图指针出现错误! vs2005远程调试的问题
我就是这么直接使用的,没见不行啊
//***************Ansi转化为UTF-8*******************//
int wcsLen = ::MultiByteToWideChar(CP_ACP, NULL, szSrc, strlen(szSrc), NULL, 0);
//分配空间要给'\0'留个空间,MultiByteToWideChar不会给'\0'空间
wchar_t* wszString = new wchar_t[wcsLen + 1];
//转换
::MultiByteToWideChar(CP_ACP, NULL, szSrc, strlen(szSrc), wszString, wcsLen);
//最后加上'\0'
wszString[wcsLen] = '\0';
int u8Len = ::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), NULL, 0, NULL, NULL);
//同上,分配空间要给'\0'留个空间
//UTF8虽然是Unicode的压缩形式,但也是多字节字符串,所以可以以char的形式保存
char* szU8 = new char[u8Len + 1];
//转换
//unicode版对应的strlen是wcslen
::WideCharToMultiByte(CP_UTF8, NULL, wszString, wcslen(wszString), szU8, u8Len, NULL, NULL);
其它的都无所谓
----------------------------------------------------------
那得看具体情况了。首先,你得清楚VC中Ansi、Unicode、UTF8编码的编码方式:
Ansi字符串我们最熟悉,英文占一个字节,汉字2个字节,以一个\0结尾,常用于txt文本文件
Unicode字符串,每个字符(汉字、英文字母)都占2个字节,以2个连续的\0结尾,而UTF8是Unicode一种压缩形式,比如英文A在unicode中表示为0x0041,但这种存储方式太浪费,因为浪费了50%的空间,于是就把英文压缩成1个字节,成了utf8编码,但是汉字在utf8中占3个字节,显然用做中文不如ansi合算例如对文本进行读写操作的时候,就得看文本内容是英文还是中文,或者中英文等,根据不同编码对中英字符所占长度的不同,选择不同的编码。当然,现如今,你也不必非要考虑这些细节问题
sqlite3_open 需要UTF-8吧
嵌入式的DBMS呢