DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: cdk19821
今日帖子: 35
在线用户: 16
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 myso (unver) ★☆☆☆☆ -
盒子活跃会员
2011/8/13 7:26:35
标题:
求助ansitoUTF8的问题 浏览:2718
加入我的收藏
楼主: 我在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;
----------------------------------------------
-我是一只菜菜鸟.
作者:
男 fausten (fausten) ★☆☆☆☆ -
盒子活跃会员
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;
}
----------------------------------------------
-
作者:
男 fausten (fausten) ★☆☆☆☆ -
盒子活跃会员
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
----------------------------------------------
-我是一只菜菜鸟.
作者:
男 gregma (gregma) ★☆☆☆☆ -
普通会员
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;
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS