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]
转载于:https://www.cnblogs.com/pengkunfan/p/3794663.html
UTF8转换为GB编码gb2312转换为utf-8相关推荐
- 关于Unicode,UTF-8,GB编码详解
内容来自网络, 有部分修正 一.首先我们需要明白关于字符(character),字符集(character set),字符编码方式(character encoding)的概念. 字符 :字符是抽象的 ...
- vbs 转码 gb2312转换为UTF-8编码的函数
<% 1.'UTF转GB---将UTF8编码文字转换为GB编码文字 function UTF2GB(UTFStr) for Dig=1 to len(UTFStr) '如果UTF8编码文字以 ...
- android mp3 lrc歌词文件utf-8歌词显示为乱码,百度歌词显示乱码 LRC歌词批量转换 UTF-8编码批量转换为GB或ANSI 文本编码批量转换...
百度歌词显示乱码LRC歌词批量转换UTF-8编码批量转换为GB或ANSI 文本编码批量转换 当从百度下载很多歌词的时候,发现在一些MP3上播放总是显示乱码,这时以为是MP3的问题或者是百度歌词的问题, ...
- ascii转utf8 php,PHP 将ASCII转换为UTF-8编码
如果我们知道当前的编码是ASCII,则可以使用'iconv'函数将ASCII转换为UTF-8.原始字符串可以作为参数传递给iconv函数,以将其编码为UTF-8. 示例<?php $str = ...
- UTF-8,Unicode,GB2312编码转换(C语言)
UTF-8,Unicode,GB2312编码转换(C语言) 最近在做MQTT客户端的时候,遇到需要将输入的GB2312中文转换为UTF8的问题,这边做一个整理. UTF-8转GB2312 代码: /* ...
- 字符编码知识:Unicode、UTF-8、ASCII、GB2312等编码之间是如何转换的?
字符编码知识:Unicode.UTF-8.ASCII.GB2312等编码之间是如何转换的? 字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得字符编码的知识.不注意的人可能对这个不在意,但这些 ...
- Java编码ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16 编码方式详解
1 ASCII American Standard Code for Information Interchange.最早最通用的单字节编码系统,因为发明时间早,所以ASCII编码表的设计较为简单. ...
- GB编码与UTF8编码的转换【转载】
在主函数app后加上这句: QTextCodec::setCodecForLocale(QTextCodec::codecForName("GB18030")); 然后是从UTF8 ...
- 2字节十六进制浮点数 qt_Qt 中十六进制字节流转换为Base64编码
在Qt中,在网络通信时,有时需要将16进制字节流转换为Base64编码传输,在Qt的QByteArray类中,提供了与Base64转换的接口: //16进制字节流转为Base64 QByteArray ...
最新文章
- matplotlib绘制多个子图
- gdb工作原理(二)
- 从Java中的length和length()开始
- docker容器的本地局域网yum源优化
- DBGrid内使用CheckBox功能
- mysql+keepalived必须要lvs吗_Mysql双主热备+LVS+Keepalived高可用操作记录
- 【LeetCode】3月16日打卡-Day1
- python傅里叶逆变换_OpenCV-Python系列之傅里叶变换
- Gartner:2012年应用安全Hype Cycle
- EAST: An Efficient and Accurate Scene Text Detector(自然场景下文本识别)训练,测试
- HDOJ 5087 Revenge of LIS II DP
- linux系统之编译内核实现iptables应用层过滤
- linux查看有哪些用户连接到本机
- Openssl genrsa命令
- C#中方法参数的传递方式: 值类型(默认),ref类型,out类型和params类型
- vlan绑定_【实操】多VLAN间通信
- github网络安全项目工具集合
- 海贼王 动漫 全集目录 分章节 精彩打斗剧集
- cuda的tip: nvcc的-arch,-code选项
- ES, MongoDB, HBase的区别和使用场景
热门文章
- Postfix无法正常发送邮件故障的排除
- vue transition动画
- Python编译出现错误SyntaxError: Non-ASCII character '\xe7' 时解决方法
- 分页技巧_实现第一个分页功能(回复列表中的分页)
- win7找回丢失的右键新建记事本选项
- JAVA游戏编程之三----j2me 手机游戏入门开发--俄罗斯方块_5_使用LUA脚本写游戏
- U盘安装Centos7.0图解
- Linux系统结构学习
- C# - 基于LinkLabel可动态生成多超链接信息的自定义控件
- 软件开发的N种基础武器 - 最新清单