这个方法是用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]

转载于:https://www.cnblogs.com/pengkunfan/p/3794663.html

UTF8转换为GB编码gb2312转换为utf-8相关推荐

  1. 关于Unicode,UTF-8,GB编码详解

    内容来自网络, 有部分修正 一.首先我们需要明白关于字符(character),字符集(character set),字符编码方式(character encoding)的概念. 字符 :字符是抽象的 ...

  2. vbs 转码 gb2312转换为UTF-8编码的函数

    <% 1.'UTF转GB---将UTF8编码文字转换为GB编码文字 function UTF2GB(UTFStr) for Dig=1 to len(UTFStr)   '如果UTF8编码文字以 ...

  3. android mp3 lrc歌词文件utf-8歌词显示为乱码,百度歌词显示乱码 LRC歌词批量转换 UTF-8编码批量转换为GB或ANSI 文本编码批量转换...

    百度歌词显示乱码LRC歌词批量转换UTF-8编码批量转换为GB或ANSI 文本编码批量转换 当从百度下载很多歌词的时候,发现在一些MP3上播放总是显示乱码,这时以为是MP3的问题或者是百度歌词的问题, ...

  4. ascii转utf8 php,PHP 将ASCII转换为UTF-8编码

    如果我们知道当前的编码是ASCII,则可以使用'iconv'函数将ASCII转换为UTF-8.原始字符串可以作为参数传递给iconv函数,以将其编码为UTF-8. 示例<?php $str =  ...

  5. UTF-8,Unicode,GB2312编码转换(C语言)

    UTF-8,Unicode,GB2312编码转换(C语言) 最近在做MQTT客户端的时候,遇到需要将输入的GB2312中文转换为UTF8的问题,这边做一个整理. UTF-8转GB2312 代码: /* ...

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

    字符编码知识:Unicode.UTF-8.ASCII.GB2312等编码之间是如何转换的? 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不在意,但这些 ...

  7. Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解

    1 ASCII American Standard Code for Information Interchange.最早最通用的单字节编码系统,因为发明时间早,所以ASCII编码表的设计较为简单. ...

  8. GB编码与UTF8编码的转换【转载】

    在主函数app后加上这句: QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030")); 然后是从UTF8 ...

  9. 2字节十六进制浮点数 qt_Qt 中十六进制字节流转换为Base64编码

    在Qt中,在网络通信时,有时需要将16进制字节流转换为Base64编码传输,在Qt的QByteArray类中,提供了与Base64转换的接口: //16进制字节流转为Base64 QByteArray ...

最新文章

  1. matplotlib绘制多个子图
  2. gdb工作原理(二)
  3. 从Java中的length和length()开始
  4. docker容器的本地局域网yum源优化
  5. DBGrid内使用CheckBox功能
  6. mysql+keepalived必须要lvs吗_Mysql双主热备+LVS+Keepalived高可用操作记录
  7. 【LeetCode】3月16日打卡-Day1
  8. python傅里叶逆变换_OpenCV-Python系列之傅里叶变换
  9. Gartner:2012年应用安全Hype Cycle
  10. EAST: An Efficient and Accurate Scene Text Detector(自然场景下文本识别)训练,测试
  11. HDOJ 5087 Revenge of LIS II DP
  12. linux系统之编译内核实现iptables应用层过滤
  13. linux查看有哪些用户连接到本机
  14. Openssl genrsa命令
  15. C#中方法参数的传递方式: 值类型(默认),ref类型,out类型和params类型
  16. vlan绑定_【实操】多VLAN间通信
  17. github网络安全项目工具集合
  18. 海贼王 动漫 全集目录 分章节 精彩打斗剧集
  19. cuda的tip: nvcc的-arch,-code选项
  20. ES, MongoDB, HBase的区别和使用场景

热门文章

  1. Postfix无法正常发送邮件故障的排除
  2. vue transition动画
  3. Python编译出现错误SyntaxError: Non-ASCII character '\xe7' 时解决方法
  4. 分页技巧_实现第一个分页功能(回复列表中的分页)
  5. win7找回丢失的右键新建记事本选项
  6. JAVA游戏编程之三----j2me 手机游戏入门开发--俄罗斯方块_5_使用LUA脚本写游戏
  7. U盘安装Centos7.0图解
  8. Linux系统结构学习
  9. C# - 基于LinkLabel可动态生成多超链接信息的自定义控件
  10. 软件开发的N种基础武器 - 最新清单