导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
myso (unver)
★☆☆☆☆
-
盒子活跃会员
2011/8/13 7:26:35
标题:
加入我的收藏
楼主:
我在delphi 2007中使用 ansitoUTF8 能得到utf8 编码 而在delphi xe 中使用ansitoUTF8 得不到utf8编码 请问各位如何解决?
----------------------------------------------
-我是一只菜菜鸟.
作者:
myso (unver)
★☆☆☆☆
-
盒子活跃会员
2011/8/13 8:08:44
1楼:
function UnicodeToUTF8String(ASource: string): AnsiString; inline; begin SetLength(Result, 256); ZeroMemory(PAnsiChar(Result), 256); UnicodeToUtf8(PAnsiChar(Result), PChar(ASource), 256); end;
----------------------------------------------
-我是一只菜菜鸟.
作者:
2011/8/13 13:42:30
2楼:
昨天我也在找转换的函数,找到两个C写的,打包到dll中,用起来速度还挺快的。 //GBK编码转换到UTF8编码 int GBKToUTF8(unsigned char * lpGBKStr,unsigned char * lpUTF8Str,int nUTF8StrLen) { wchar_t * lpUnicodeStr = NULL; int nRetLen = 0; if(!lpGBKStr) //如果GBK字符串为NULL则出错退出 return 0; nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,NULL,NULL); //获取转换到Unicode编码后所需要的字符空间长度 lpUnicodeStr = new WCHAR[nRetLen + 1]; //为Unicode字符串空间 nRetLen = ::MultiByteToWideChar(CP_ACP,0,(char *)lpGBKStr,-1,lpUnicodeStr,nRetLen); //转换到Unicode编码 if(!nRetLen) //转换失败则出错退出 return 0; nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0,NULL,NULL); //获取转换到UTF8编码后所需要的字符空间长度 if(!lpUTF8Str) //输出缓冲区为空则返回转换后需要的空间大小 { if(lpUnicodeStr) delete []lpUnicodeStr; return nRetLen; } if(nUTF8StrLen < nRetLen) //如果输出缓冲区长度不够则退出 { if(lpUnicodeStr) delete []lpUnicodeStr; return 0; } nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char *)lpUTF8Str,nUTF8StrLen,NULL,NULL); //转换到UTF8编码 if(lpUnicodeStr) delete []lpUnicodeStr; return nRetLen; } // UTF8编码转换到GBK编码 int UTF8ToGBK(unsigned char * lpUTF8Str,unsigned char * lpGBKStr,int nGBKStrLen) { wchar_t * lpUnicodeStr = NULL; int nRetLen = 0; if(!lpUTF8Str) //如果UTF8字符串为NULL则出错退出 return 0; nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,NULL,NULL); //获取转换到Unicode编码后所需要的字符空间长度 lpUnicodeStr = new WCHAR[nRetLen + 1]; //为Unicode字符串空间 nRetLen = ::MultiByteToWideChar(CP_UTF8,0,(char *)lpUTF8Str,-1,lpUnicodeStr,nRetLen); //转换到Unicode编码 if(!nRetLen) //转换失败则出错退出 return 0; nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,NULL,NULL,NULL,NULL); //获取转换到GBK编码后所需要的字符空间长度 if(!lpGBKStr) //输出缓冲区为空则返回转换后需要的空间大小 { if(lpUnicodeStr) delete []lpUnicodeStr; return nRetLen; } if(nGBKStrLen < nRetLen) //如果输出缓冲区长度不够则退出 { if(lpUnicodeStr) delete []lpUnicodeStr; return 0; } nRetLen = ::WideCharToMultiByte(CP_ACP,0,lpUnicodeStr,-1,(char *)lpGBKStr,nRetLen,NULL,NULL); //转换到GBK编码 if(lpUnicodeStr) delete []lpUnicodeStr; return nRetLen; }
----------------------------------------------
-
作者:
2011/8/13 13:46:55
3楼:
用法: s := http.Get('http://。。。'); i := utf8togbk(PChar(s),nil,0); //先传入空地址,得到转换后长度 SetLength(s1,i); //准备好存放转换后的字串 i := Utf8ToGBK(PChar(s),PChar(s1),i);
----------------------------------------------
-
作者:
myso (unver)
★☆☆☆☆
-
盒子活跃会员
2011/8/15 7:40:32
4楼:
function UnicodeToUTF8String(ASource: string): AnsiString; inline; begin SetLength(Result, 256); ZeroMemory(PAnsiChar(Result), 256); UnicodeToUtf8(PAnsiChar(Result), PChar(ASource), 256); end; 快疯了,碰到单数汉字 转换错误。。怎么办啊?各位老大
----------------------------------------------
-我是一只菜菜鸟.
作者:
myso (unver)
★☆☆☆☆
-
盒子活跃会员
2011/8/15 10:23:10
5楼:
郁闷阿。。。头晕重。
----------------------------------------------
-我是一只菜菜鸟.
作者:
myso (unver)
★☆☆☆☆
-
盒子活跃会员
2011/8/15 13:04:08
6楼:
fausten (fausten) 哥们,麻烦给我个联系方式好么:cbsoft@163.com
----------------------------------------------
-我是一只菜菜鸟.
作者:
2011/8/15 17:13:49
7楼:
需要从unicode string中转一下吧。先变成unicode 的,然后再变成utf8的。 不仅仅是windows,各种unix,包括linux,solaris等,在处理不同的locale的时候大都是通过unicode中转一下的。直接转化的话,系统本身需要提供N*(N-1)/2种不同的转化表格, N为系统中不同locale的个数;通过unicode做中转,就只需要n-1种表格。 大致的代码如下,随手写的,没调试过。 function my_ansiToUtf8(const s: AnsiString): utf8string; var s1: string; //unicode string begin s1 := string(s); Result := utf8string(s1); end;
----------------------------------------------
-