这个方法是用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. 常用HTML标签的全称及描述

    常用HTML标签的英文全称及简单描述   HTML标签 英文全称 中文释义 a Anchor 锚 abbr Abbreviation 缩写词 acronym Acronym 取首字母的缩写词 addr ...

  2. Table分页显示调整

    这是table分页显示的代码,下面是对应调整的代码 /*分页调整*/ .fenye .dataTables_info{ line-height: 28px; } .fenye .pagination{ ...

  3. APNS .p12文件转换为 .pem文件

    1:先用mac的钥匙串工具,把APN的推送证书转换为 .p12文件: 2:在mac的终端下 把.p12文件转换为 .pem文件 openssl pkcs12 -in apns-dev-cert.p12 ...

  4. JavaScript 数组去重并统计重复元素出现的次数

    1.方法一 var arr = [1, 2, 3, 1, 2, 4]; function arrayCnt(arr) { var newArr = []; for(var i = 0; i < ...

  5. Vue Element Form表单时间验证控件使用

    如果直接使用Element做时间选择器,其规则(rules)不添加type:'date',会提示类型错误,处理这个需要规范值的类型为date. 时间格式化过滤器 import Vue from 'vu ...

  6. zookeeper(一):功能和原理

    简介 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅.负载均衡.命名服务.分 ...

  7. 优化数据页面(22)——n:n的数据关系

    设计要点:优化数据页面.界面设计.美化exce 阿金:那n::n就复杂了,你倒是想留有空间. 可是现实社会有时却不同意. 秀秀:唉.说的也是. 阿金:那怎么表达才合适啊? 秀秀:仅仅实用网格了. 阿金 ...

  8. Atitit.vod 视频播放系统 影吧系统的架构图 架构体系 解决方案

    Atitit.vod 视频播放系统 影吧系统的架构图 架构体系 解决方案 1. 运行平台:跨平台 android ios pc mobile 1.1. -------------前端 界面------ ...

  9. 大型站点技术架构PDF阅读笔记(一):

    1.数据库读写分离: 2.系统吞吐量和系统并发数以及系统响应时间之间的关系: 3.系统负载的概念: 4.反向代理的概念: 5.使用缓存来读取数据: 6.利用cookie来记录session: 利用co ...

  10. 实例探索Class文件

    class文件是指以.class为文件后缀的Java虚拟机可装载文件.无论该class文件是在linux上进行编译的,还是在windows环境下编译的,无论虚拟机是在何种平台下实现和运行的,class ...