免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: taotao_112206_c
打印 上一主题 下一主题

[C] C语言 如何将utf8 转化为ascii [复制链接]

论坛徽章:
3
摩羯座
日期:2013-11-12 20:06:19午马
日期:2013-11-27 16:35:55双鱼座
日期:2014-04-04 19:02:30
21 [报告]
发表于 2012-11-17 08:26 |只看该作者
lz的意思是不是把utf-8编码的数据当成裸数据,一个字节一个字节的拿出来,然后把这个字节当成ASCII?

是不是这个意思,就像utf-8表示的中文,可能需要两个个字节 0x67D2。lz想把 0x67 和0xD2 拿出来当ASCII,是这个意思吗?

lz说的意思是不是真的这么简单?

论坛徽章:
0
22 [报告]
发表于 2012-11-17 12:31 |只看该作者
回复 21# mci2004


    谢谢了,兄弟,是这个意思

论坛徽章:
0
23 [报告]
发表于 2012-11-17 22:56 |只看该作者
int utf8toansi(const char *szStrUtf8, int cbSize, char *szOut, int cbOut)
{
  int cbRet;
  if (!szOut) {
    return MultiByteToWideChar(CP_UTF8, 0, szStrUtf8, cbSize, 0, 0);
  }

  cbRet = MultiByteToWideChar(CP_UTF8, 0, szStrUtf8, cbSize, szOut, cbOut)
  if (0 == cbRet) {
    return -1;
  }

  return cbRet;
}

int cbOut = utf8toansi(utf8, strlen(utf+1, 0, 0);
char *ansiOut = malloc(cbOut);
if (cbOut != utf8toansi(utf8, strlen(utf+1, ansiOut, cbOut)) {
  printf("utf8toansi error\n";
}

论坛徽章:
0
24 [报告]
发表于 2012-11-17 23:09 |只看该作者
// 先把utf8转成BSTR
//
static int utf8_decode(LPCSTR pUtf8, int cbSize, BSTR *pBstr)
{
        if (!pBstr)
                return 0;
       
        *pBstr = 0;

        if (!pUtf
                return 0;
       
        assert(cbSize>0);

        int   cchNeeded = ::MultiByteToWideChar(CP_UTF8, 0, pUtf8, cbSize, 0, 0);
        if (0 == cchNeeded)
                return 0;
       
        LPSTR        pstr = (LPSTR) ::CoTaskMemAlloc (sizeof(DWORD) + sizeof(WCHAR)*cchNeeded + sizeof(CHAR));
        if (!pstr)
                return -1;  // OUT OF MEMORY

        int cchRet = ::MultiByteToWideChar(CP_UTF8, 0, pUtf8, cbSize, (LPWSTR)(pstr+sizeof(DWORD)), cchNeeded);
        if (0 == cchRet){
                CoTaskMemFree(pstr);
                return -2;  // ERROR
        }

        // 0-ending
        pstr[ sizeof(DWORD) + sizeof(WCHAR)*cchNeeded ] = 0;

        *((DWORD*)pstr) = sizeof(WCHAR)*(cchNeeded);
        *pBstr = (BSTR)(pstr + sizeof(DWORD));
        assert(cchNeeded>0);
        return cchNeeded;
}

// 把unicode转陈ansi
//
static int Unicode2Ansi (LPCWSTR wszStr, LPSTR *ppAnsiOut, WCHAR errMsg[], DWORD dwMsgSize)
{
        const UINT CodePage = 0;
        int   cbRetSize = 0;
        *ppAnsiOut = 0;

        if ( wszStr == NULL )
                return 0;

        int                cchNeeded ;

        if ( 0 == (cchNeeded = ::WideCharToMultiByte (CodePage, 0, wszStr, -1, NULL, 0, NULL, NULL)) ){
                GetErrorMsgW(GetLastError(), errMsg, dwMsgSize);
                return 0;
        }

        PSTR        szAnsi = (PSTR) ::malloc (sizeof (CHAR) * cchNeeded) ;
        if ( szAnsi == NULL ){
#pragma   warning( disable: 4996 )  
                wcscpy(errMsg, L"Out of mempry";
#pragma   warning( default: 4996 )
                return 0;
        }

        cbRetSize = ::WideCharToMultiByte (CodePage, 0, wszStr, -1, szAnsi, cchNeeded, NULL, NULL);
        assert(cbRetSize==cchNeeded);
        if ( 0 ==  cbRetSize) {
                GetErrorMsgW(GetLastError(), errMsg, dwMsgSize);
                SAFEFREE (szAnsi);
                return 0;
        }

        *ppAnsiOut = szAnsi;
        return cbRetSize ;
}

注意java字符串没有末尾空字符
注意BSTR != WSTR

没时间,要不就写出来了

这个论坛的回复验证码太垃圾了

论坛徽章:
0
25 [报告]
发表于 2012-11-18 12:00 |只看该作者
回复 19# windoze


    这个靠谱,但是估计lz需要中文,还是转为GB码好点。

论坛徽章:
0
26 [报告]
发表于 2012-11-18 16:38 |只看该作者
回复 22# taotao_112206_c


    那你需要的是一个可以处理utf8的xml-parser, 例如libxml2。

论坛徽章:
0
27 [报告]
发表于 2012-11-19 10:49 |只看该作者
回复 26# KanonInD


    谢谢楼上兄弟,我们用的就是libxml2 ,可就是出问题,不得其解,其实这个问题也不是经常出现,但出现生僻字,或者不是标准字符的时候,就会出问题,
当然对系统来说,需要容错功能,看来暂时一会难解。

论坛徽章:
0
28 [报告]
发表于 2012-11-19 10:50 |只看该作者
回复 24# cheungmine


    谢谢兄弟,你这个是VC啊,windows下的,我要的是unix下的,更确切的说是AIX上的

论坛徽章:
0
29 [报告]
发表于 2012-11-19 13:31 |只看该作者
楼主是做 xml格式转换方面的么

论坛徽章:
5
白羊座
日期:2014-10-28 11:23:27水瓶座
日期:2015-01-20 10:19:022015亚冠之柏斯波利斯
日期:2015-07-11 18:17:2015-16赛季CBA联赛之同曦
日期:2015-12-23 12:38:582016猴年福章徽章
日期:2016-02-18 15:30:34
30 [报告]
发表于 2012-11-19 13:37 |只看该作者
LZ其实是要把GBK转成UTF-8的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP