UTF8转换为GB编码gb2312转换为utf-8
这个方法是用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的更多相关文章
- 【笔试题】怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串?
笔试题 怎样将 GB2312 编码的字符串转换为 ISO-8859-1 编码的字符串? import java.io.UnsupportedEncodingException; public clas ...
- 字符编码GB2312、GBK、UTF-8的区别
本文来自:javaeye网站 UTF8是国际编码,它的通用性比较好,外国人也可以浏览论坛 GBK是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大~ 提示:如果您的网站客户群体主要是面 ...
- 网络编码 GB2312、GBK与UTF-8的区别
GB2312.GBK与UTF-8的区别 这是一个异常经典的问题,有无数的新手站长每天都在百度这个问题,而我,作为一个“伪老手”站长,在明白这个这个问题的基础上,有必要详细的解答一下. 首先,我们要 ...
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
转自: http://apps.hi.baidu.com/share/detail/17798660 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不 ...
- GB2312、GBK和UTF-8三种编码以及QT中文显示乱码问题
1.GB2312.GBK和UTF-8三种编码的简要说明 GB2312.GBK和UTF-8都是一种字符编码,除此之外,还有好多字符编码.只是对于我们中国人的应用来说,用这三种编码 比较多.简单的说一下, ...
- Javascript 将图片的绝对路径转换为base64编码
Javascript将图片的绝对路径转换为base64编码 我们可以使用canvas.toDataURL的方法将图片的绝对路径转换为base64编码:在这我们引用的是淘宝首页一张图片如下: var i ...
- nodejs抓取网络图片转换为base64编码的图片
抓取网络图片需要加载http模块 //假定这是index.js文件 var http = require('http'); var url = 'http://p0.meituan.net/tuanp ...
- 使用iconv进行编码gb2312转utf8 转码失败的坑
iconv 编码gb2312转utf8 转码失败的坑 使用背景 项目中使用thrift进行C#程序调用c++接口,其中的协议是通过json进行传输的,由于默认thrift使用utf8进行传输,而C#和 ...
- Js 将图片的绝对路径转换为base64编码
转.... 我们可以使用canvas.toDataURL的方法将图片的绝对路径转换为base64编码:在这我们引用的是淘宝首页一张图片如下: var img = "https://img. ...
随机推荐
- MyCAT学习总结
MyCAT介绍 简单的说,MyCAT就是: 一个彻底开源的,面向企业应用开发的“大数据库集群” 支持事务.ACID(指数据库事务正确执行的四个基本要素的缩写.包含:原子性(Atomicity).一 ...
- SVN 常见命令
一.什么是SVN SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. 二.SVN的下载安装 下载地址:http ...
- lodash获取数组或对象的值 at
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- canvas贝济埃曲线
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- malloc、calloc、realloc的区别(转)
(1)C语言跟内存分配方式 <1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2> ...
- 详细解说 STL 排序(Sort)(转)
作者Winter 详细解说 STL 排序(Sort) 0 前言: STL,为什么你必须掌握 1 STL提供的Sort 算法 1.1 所有sort算法介绍 1.2 sort 中的比较函数 1.3 sor ...
- Android双向seekbar
※效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/disso ...
- springmvc使用实体參数和ServletAPI
一. 实体參数 前面我们知道使用注解@RequestParam能够获得參数的值,那么如今提交一个表单怎么获得当中的值了.你能够说能够使用request.getParameter("" ...
- 04-hibernate注解-一对一双向外键关联
一对一双向外键 1,主控方的配置同一对一单向外键关联. 2,@OneToOne(mappedBy="card") //被控方 @OneToOne(mappedBy="ca ...
- Codeigniter 使用 Mysql 存储过程
本篇文章由:http://xinpure.com/codeigniter-using-mysql-stored-procedures/ 执行存储过程 $query = $this -> db - ...