`
jimmee
  • 浏览: 538698 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

c中实现utf8和gbk的互转

阅读更多
#include <iconv.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>

int code_convert(char *from_charset, char *to_charset, char *inbuf, size_t inlen,
		char *outbuf, size_t outlen) {
	iconv_t cd;
	char **pin = &inbuf;
	char **pout = &outbuf;

	cd = iconv_open(to_charset, from_charset);
	if (cd == 0)
		return -1;
	memset(outbuf, 0, outlen);
	if (iconv(cd, pin, &inlen, pout, &outlen) == -1)
		return -1;
	iconv_close(cd);
	*pout = '\0';

	return 0;
}

int u2g(char *inbuf, size_t inlen, char *outbuf, size_t outlen) {
	return code_convert("utf-8", "gb2312", inbuf, inlen, outbuf, outlen);
}

int g2u(char *inbuf, size_t inlen, char *outbuf, size_t outlen) {
	return code_convert("gb2312", "utf-8", inbuf, inlen, outbuf, outlen);
}

int main(void) {
	char *s = "中国";
	int fd = open("test.txt", O_RDWR|O_CREAT, S_IRUSR | S_IWUSR);
	char buf[10];
	u2g(s, strlen(s), buf, sizeof(buf));
	write(fd, buf, strlen(buf));
	close(fd);

	fd = open("test.txt2", O_RDWR|O_CREAT, S_IRUSR | S_IWUSR);
	char buf2[10];
	g2u(buf, strlen(buf), buf2, sizeof(buf2));
	write(fd, buf2, strlen(buf2));
	close(fd);
	return 1;
}

 

上面是使用iconv函数。

 

方式二: 使用如下两个函数

mbstowcs将多字节编码转换为宽字节编码

wcstombs将宽字节编码转换为多字节编码

注意, 需要系统编码的支持, 可以通过locale -a 查看系统支持的。若不支持zh_CN.gbk, 需要安装,例如,在ubuntu上的安装步骤如下:

 


编辑

$sudo vi /var/lib/locales/supported.d/zh-hans
更新成
zh_CN.UTF-8 UTF-8
zh_SG.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN.GB18030 GB18030

 

 

// 更新
$ sudo locale-gen

// 查看
$ locale -a
C
POSIX
zh_CN.gb18030
zh_CN.gbk
zh_CN.utf8
zh_SG.utf8
 
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <locale.h>

/**
 * DESCRIPTION: 实现由utf8编码到gbk编码的转换
 *
 * Input: gbkStr,转换后的字符串;  srcStr,待转换的字符串; maxGbkStrlen, gbkStr的最
 大长度
 * Output: gbkStr
 * Returns: -1,fail;>0,success
 *
 */
int utf82gbk(char *gbkStr, const char *srcStr, int maxGbkStrlen) {
	if (NULL == srcStr) {
		printf("Bad Parameter\n");
		return -1;
	}

	//首先先将utf8编码转换为unicode编码
	if (NULL == setlocale(LC_ALL, "zh_CN.utf8")) //设置转换为unicode前的码,当前为utf8编码
			{
		printf("Bad Parameter\n");
		return -1;
	}

	int unicodeLen = mbstowcs(NULL, srcStr, 0); //计算转换后的长度
	if (unicodeLen <= 0) {
		printf("Can not Transfer!!!\n");
		return -1;
	}
	wchar_t *unicodeStr = (wchar_t *) calloc(sizeof(wchar_t), unicodeLen + 1);
	mbstowcs(unicodeStr, srcStr, strlen(srcStr)); //将utf8转换为unicode

	//将unicode编码转换为gbk编码
	if (NULL == setlocale(LC_ALL, "zh_CN.gbk")) //设置unicode转换后的码,当前为gbk
			{
		printf("Bad Parameter\n");
		return -1;
	}
	int gbkLen = wcstombs(NULL, unicodeStr, 0); //计算转换后的长度
	if (gbkLen <= 0) {
		printf("Can not Transfer!!!\n");
		return -1;
	} else if (gbkLen >= maxGbkStrlen) //判断空间是否足够
			{
		printf("Dst Str memory not enough\n");
		return -1;
	}
	wcstombs(gbkStr, unicodeStr, gbkLen);
	gbkStr[gbkLen] = 0; //添加结束符
	free(unicodeStr);
	return gbkLen;
}

int main(void) {
	char *s = "中国";
	int fd = open("test.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
	char buf[10];
	utf82gbk(buf, s, sizeof(buf));
	write(fd, buf, strlen(buf));
	close(fd);

	return 1;
}

 
 
0
5
分享到:
评论

相关推荐

    UTF8-GBK编码互转(C)

    在C语言中实现UTF8和GBK的互转,需要理解这两种编码的结构和转换规则。UTF8的转换涉及识别字节序列,根据前导字节判断字符的长度,然后将其转换为GBK编码。GBK的转换则相反,需要将GBK编码的字节流解析成对应的UTF8...

    windows下利用libiconv将实现utf8和gbk编码之间转换

    本主题主要关注如何利用libiconv库在Windows上实现UTF-8和GBK编码之间的转换。libiconv是一个广泛使用的字符编码转换工具,它支持多种编码格式,包括UTF-8和GBK。 UTF-8是一种变长的Unicode编码方式,每个Unicode...

    utf8与gbk互转.zip

    本压缩包文件"utf8与gbk互转.zip"包含两个源文件——utf8togbk.c和utf8togbk.h,它们提供了在C语言环境下,UTF8与GBK编码之间的转换方法,无需依赖iconv库或其他操作系统特定的API。 首先,我们来了解UTF8和GBK编码...

    C语言GBK、Unicode与UTF8互转代码,含转码表及接口函数

    本文将深入探讨C语言中GBK、Unicode和UTF-8之间的转换,并提供相关的转码表和接口函数。 首先,让我们了解一下这三种编码标准: 1. **GBK编码**:GBK是中国大陆广泛使用的汉字编码标准,它是GB2312的扩展,兼容GB...

    GBK转UTF C语言 单片机

    因此,将GBK转UTF-8的工具或函数库对于这类系统尤其重要,以便能够正确地显示和处理包含多语言或者特殊字符的信息。 转换过程通常包括以下几个步骤: 1. **读取GBK文件**:首先,程序需要读取GBK编码的文本文件,将...

    c/c++ 字符集 gbk/utf8互转,Ansi/Utf8互转 纯c实现跨平台

    综上所述,`c/c++ 字符集 gbk/utf8互转,Ansi/Utf8互转 纯c实现跨平台`涉及了字符编码理论、字符串处理和跨平台编程技术。通过理解这些知识点,并结合提供的源代码,开发者可以构建出能够在各种环境下正确处理字符...

    UTF-8编码和GBK编码互转,一个头文件搞定!跨平台不使用第三方库

    原理是将UTF-8编码的汉字、字母、符号、数字等转换成unicode编码,而unicode和GBK编码存在对应关系,所以只需要将对应的unicode编码的数据对应转换码表(查表)即可得到GBK编码的内容,实现UTF-8和GBK编码互转。...

    c语言利用编码转换表实现gbk与unicode互转

    通过以上步骤,我们就能够在C语言中利用编码转换表实现GBK与Unicode的互转。这种方法虽然较为原始,但在某些特定场景下,尤其是资源有限或者对性能要求较高的嵌入式系统中,仍然是一个实用的解决方案。

    GB2312编码和UTF-8互转(c语言实现)

    GB2312编码与utf-8编码的字符串的转换,主要使用windows api函数MultiByteToWideChar和WideCharToMultiByte,代码简洁,经测试可用

    GB2312转UTF-8(C代码)

    本资源提供了一个C语言实现的GB2312到UTF-8的转换函数,方便开发者在需要进行这种编码转换时使用。 GB2312是中国大陆早期广泛使用的简体中文字符编码,它包含了6763个常用汉字和一些其他符号,主要适用于简体中文...

    ucs2Gbk互转的code_自己写的

    在`www.pudn.com.txt`和`ucs2Gbk互转的code_自己写的`这两个文件中,可能包含了具体的转换代码实现和示例数据。阅读这些文件可以帮助你更好地理解和应用这个自定义转换方法。请确保在实际操作时遵循版权规定,合理...

    GBK编码转换汉字,汉字转换GBK编码,VC代码实现

    本篇文章将深入探讨如何在VC++环境中,利用MFC(Microsoft Foundation Classes)框架实现GBK编码与汉字之间的转换,以及BCD(Binary Coded Decimal)编码和ASCII编码的转换。 首先,我们来看GBK编码和汉字的转换。...

    unicode与GB18030(GB2312,GBK) 转换码表

    例如,通过`codecs.decode()`和`codecs.encode()`方法,可以实现GB18030到Unicode,或者Unicode到GB18030的转换。 理解这些编码标准和转换过程对于处理中文文本的软件开发者来说至关重要,尤其是当涉及到跨平台、跨...

    Unicode转换成GBK

    通过本文的学习,我们了解了Unicode和GBK的基本概念以及如何使用C/C++语言实现Unicode到GBK的编码转换。在实际应用中,这样的转换功能是非常实用的,特别是在处理跨语言平台的数据交互时。希望本文能够帮助大家更好...

    txt乱码解决处理文本文件转码编码csv器gbk互转utf-8自动批量工具html,js,css,md,json,log,py

    一键自动实现gbk、utf-8互转,不需要任何设置 也支持指定编码方式后,一键转码 强制模式:不支持转码的字符可跳过(目前处理方式是替换成”?”),强制完成转码 支持批量转码 多线程高性能:批量处理方式是多线程...

    为SQLite3提供一个ANSI到UTF8的互转函数

    标题所提到的“为SQLite3提供一个ANSI到UTF8的互转函数”是指在与SQLite3交互过程中,由于不同的系统和程序可能采用不同的字符编码标准,如ANSI(通常指的是Windows系统的默认编码,如GBK)和UTF8,因此需要编写函数...

    Unicode与GB2312互转.zip

    "uni_to_gb.h"和"GB_to_uni.h"这两个文件很可能是C语言或C++编写的头文件,用于实现Unicode和GB2312之间的转换函数。通常,这样的转换会涉及以下几个步骤: 1. **解码**:将原始编码的字节序列转换为其对应的码点。...

    UNICODE与GB编码互转C源代码

    `UnicodeToGB.c` 和 `UnicodeToGB.h` 这两个文件构成了一个 C 语言库,用于实现从 UNICODE 到 GB 和从 GB 到 UNICODE 的转换函数。下面是一些可能包含在这些源代码中的关键概念和函数: 1. **转换函数**:源代码中...

    各种字符编码间的转换方法:MultiByteToWideChar和MultiByteToWideChar.docx

    字符编码间的转换方法:...MultiByteToWideChar和WideCharToMultiByte函数是Windows操作系统中两个重要的字符编码转换函数,它们可以将不同的字符编码之间进行转换,从而实现字符编码之间的互操作性。

    字符转换工具类

    3. **数字与字符串的互转**:如`intToString(int num)`、`stringToInt(String str)`、`floatToString(float f)`和`stringToFloat(String str)`,这些方法用于在数字和字符串之间进行转换。 4. **Unicode转换**:...

Global site tag (gtag.js) - Google Analytics