这个方法是用windows的字符集转换的,跟sybase
的unicode码表可能在某些符号上有差别,对于大部分字符来说,尤其是
汉字,应该不会有问题的,如果要求比较高的话,可以买sybase的
unicode开发包,:P
[code]
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <locale.h>

#include <ctype.h>

#include <mbstring.h>

size_t mbstoutf8(unsigned char* utf, unsigned char* mbs)

{

size_t mbl = 0;

size_t wcneed = mbstowcs(NULL, mbs, mbl);

wchar_t* wc = NULL;

size_t u8need = 0;

wchar_t* wp = NULL;

mbl = _mbslen(mbs);

wcneed = mbstowcs(NULL, mbs, mbl);

wc= calloc(wcneed + 1, sizeof(wchar_t));

if (!wc)

return -1;

if (mbstowcs(wc, mbs, mbl) < mbl)

return -1;

wc[mbl] = L'\0';

wp = wc;

if (!utf)

{

while (*wp)

{

if ((*wp & 0x7f) == *wp)

u8need += 1;

else if ((*wp & 0x7ff) == *wp)

u8need += 2;

else

u8need +=3;

*wp++;

}

}

else

{

while (*wp)

{

if ((*wp & 0x7f) == *wp)

{

*utf++ = *wp & 0x7f;

u8need += 1;

}

else if ((*wp & 0x7ff) == *wp)

{

*utf++ = 0xc0 | (*wp >> 6);

*utf++ = 0x80 | (*wp & 0x3f);

u8need += 2;

}

else

{

*utf++ = 0xe0 | (*wp >> 12);

*utf++ = 0x80 | ((*wp >> 6) & 0x3f);

*utf++ = 0x80 | (*wp & 0x3f);

u8need += 3;

}

*wp++;

}

*utf = 0;

}

free(wc);

return u8need;

}

int main(void)

{

char mbs[81];

size_t sz = 0;

setlocale(LC_CTYPE, ".936");

for (; ; )

{

fgets(mbs, 80, stdin);

mbs[strlen(mbs) - 1] = '\0';

if (!*mbs)

break;

sz = mbstoutf8(NULL, mbs);

if (sz != -1)

{

char* u = malloc(sz + 1);

if (u)

{

mbstoutf8(u, mbs);

puts(u);

free(u);

}

}

}

return 0;

}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <ctype.h>
#include <mbstring.h>
#include <wchar.h>
size_t utf8tombs(unsigned char* mbs, wchar_t* utf)
{
size_t wcl = 0;
size_t mbneed = wcstombs(NULL, utf, wcl);
char* mc = NULL;
size_t gbneed = 0;
char* mp = NULL;
wcl = wcslen(utf);
gbneed = wcstombs(NULL, utf, wcl);
mc= calloc(gbneed + 1, sizeof(unsigned char));
if (!mc)
return -1;
if (wcstombs(mc, utf, wcl) < wcl)
return -1;
mc[wcl] = '\0';
mp = mc;
if (!mbs)
{
while (*mp)
{
if ((*mp & 0x80) == *mp)
gbneed += 1;
else if ((*mp & 0x800) == *mp)
gbneed += 2;
else
gbneed +=3;
*mp++;
}
}
else
{
while (*mp)
{
if ((*mp & 0x80) == *mp)
{
*mbs++ = *mp & 0x80;
gbneed += 1;
}
else if ((*mp & 0x800) == *mp)
{
*mbs++ = 0x3f | (*mp << 6);
*mbs++ = 0x7f | (*mp & 0xc0);

gbneed += 2;
}
else
{
*mbs++ = 0x1f | (*mp << 12);
*mbs++ = 0x7f | ((*mp << 6) & 0xc0);
*mbs++ = 0x7f | (*mp & 0xc0);
gbneed += 3;
}
*mp++;
}
*mbs = 0;
}
free(mc);
return gbneed;
}
int main(void)
{
char utf[81];
size_t sz = 0;
setlocale(LC_CTYPE, ".936");
for (; ; )
{
fgets(utf, 80, stdin);
utf[strlen(utf) - 1] = '\0';
if (!*utf)
break;
sz = utf8tombs(NULL, utf);
if (sz != -1)
{
char* u = malloc(sz + 1);
if (u)
{
utf8tombs(u, utf);
puts(u);
free(u);
}
}
}
return 0;
} [/code]

UTF8转换为GB编码gb2312转换为utf-8的更多相关文章

  1. 【笔试题】怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?

    笔试题 怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串? import java.io.UnsupportedEncodingException; public clas ...

  2. 字符编码GB2312、GBK、UTF-8的区别

    本文来自:javaeye网站 UTF8是国际编码,它的通用性比较好,外国人也可以浏览论坛 GBK是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大~ 提示:如果您的网站客户群体主要是面 ...

  3. 网络编码 GB2312、GBK与UTF-8的区别

    GB2312.GBK与UTF-8的区别  这是一个异常经典的问题,有无数的新手站长每天都在百度这个问题,而我,作为一个“伪老手”站长,在明白这个这个问题的基础上,有必要详细的解答一下.  首先,我们要 ...

  4. 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?

    转自:  http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不 ...

  5. GB2312、GBK和UTF-8三种编码以及QT中文显示乱码问题

    1.GB2312.GBK和UTF-8三种编码的简要说明 GB2312.GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码.只是对于我们中国人的应用来说,用这三种编码 比较多.简单的说一下, ...

  6. Javascript 将图片的绝对路径转换为base64编码

    Javascript将图片的绝对路径转换为base64编码 我们可以使用canvas.toDataURL的方法将图片的绝对路径转换为base64编码:在这我们引用的是淘宝首页一张图片如下: var i ...

  7. nodejs抓取网络图片转换为base64编码的图片

    抓取网络图片需要加载http模块 //假定这是index.js文件 var http = require('http'); var url = 'http://p0.meituan.net/tuanp ...

  8. 使用iconv进行编码gb2312转utf8 转码失败的坑

    iconv 编码gb2312转utf8 转码失败的坑 使用背景 项目中使用thrift进行C#程序调用c++接口,其中的协议是通过json进行传输的,由于默认thrift使用utf8进行传输,而C#和 ...

  9. Js 将图片的绝对路径转换为base64编码

    转.... 我们可以使用canvas.toDataURL的方法将图片的绝对路径转换为base64编码:在这我们引用的是淘宝首页一张图片如下:  var img = "https://img. ...

随机推荐

  1. database工具

    JetBrains DataGrip:一个可以支持多种数据库的IDE

  2. AutoCAD .NET二次开发(二)

    今天专门讲一个--CommandMethod.我们都在知道CAD操作要快,必须要熟悉掌握各种命令.在Lisp开发中,在函数后C:即可添加一个命令,非常方法,在.NET API也可以非常方便的设置命令, ...

  3. HDOJ 3944 DP?

    尽量沿着边走距离最短.化减后 C(n+1,k)+ n - k, 预处理阶乘,Lucas定理组合数取模 DP? Time Limit: 10000/3000 MS (Java/Others)    Me ...

  4. JDBC:数据库操作:处理大对象CLOB数据

    目标: 了解大对象处理基本原理, 掌握CLOB数据的读,写操作. 可以使用CLOB类处理大文本数据. 大对象处理主要指CLOB和BLOB两种类型字段.可以大量存储文字. 要想在程序中处理这样的大数据操 ...

  5. java集成jpush实现客户端推送

    代码地址如下:http://www.demodashi.com/demo/13700.html 前言 java 集成jpush 实现客户端推送 一.准备工作 开发环境: jdk1.6 Eclipse ...

  6. zabbix触发的多条件判断表达式

    2 Trigger expression   Overview The expressions used in triggers are very flexible. You can use them ...

  7. 深入浅出REST架构 REST架构概述

    http://www.nowamagic.net/librarys/veda/detail/885何为REST? REST是英文Representational State Transfer的缩写,中 ...

  8. unity, GetComponent<Renderer>().bounds.size vs GetComponent<MeshFilter>().sharedMesh.bounds.size

    GetComponent<MeshFilter>().sharedMesh.bounds.size获得的是未经缩放的大小. GetComponent<Renderer>().b ...

  9. [css]后台管理系统布局

    知识点: 绝对定位+overflowhidden 整体思路 三大块 pg-header---需要固定 (height:48px) pg-content menu 右侧菜单-需要固定(width:200 ...

  10. C#.NET中使用BackgroundWorker在模态对话框中显示进度条

    这里是一个示例,其中展示了如何使用Backgroundworker对象在模态对话框中显示后台操作的实时进度条. 首先是主窗体代码: using System; using System.Collect ...