ascii编码与utf8互转、ascii编码与unicode互转、utf8与unicode互转(C语言、c++)

ascii 转 uft8:

int ascii_to_utf8(const char * asciibuf, int asciilen, char * utf8buf, int utf8maxlen)
{
	int convresult = 0;
#ifdef  OS_WIN
	DWORD dwRlt = ERROR_SUCCESS;
	WCHAR * newBuf  = NULL;
	try
	{
		int newbuf_maxlen = asciilen * 2 + 1;
		newBuf = new WCHAR[newbuf_maxlen];

		CheckNewRlt(newBuf, newbuf_maxlen * sizeof(WCHAR));


		int unicode_len = MultiByteToWideChar (CP_ACP, 0,
			asciibuf, asciilen,
			newBuf,newbuf_maxlen);  

		convresult = ::WideCharToMultiByte(CP_UTF8, 0,
			newBuf,unicode_len,
			utf8buf, utf8maxlen, NULL, NULL); 
	}
	catch (DWORD dwExp)
	{
		dwRlt = dwExp;
	}
	catch (...)
	{
		dwRlt = ERROR_EXCEPTION_IN_SERVICE;
	}

	SafeDeleteAry(newBuf); 

#endif // OS_WIN

#ifdef  OS_LINUX

	char * cvt_src_buf = (char *)asciibuf;
	size_t cvt_src_len = asciilen;

	char * cvt_dst_buf = (char *)utf8buf;
	size_t cvt_dst_len = utf8maxlen;			

	convresult = CUnicodeWithAscii::common_conv(enum_coding_cvt_at8, 
		(char **)&(cvt_src_buf), &cvt_src_len,
		(char **)&(cvt_dst_buf), &cvt_dst_len);	
	
#endif // OS_LINUX

	return convresult;

}

utf8转ascii:

int utf8_to_ascii(const char * utf8buf, int utf8len, 
	char * asciibuf, int asciimaxlen)
{
	int convresult = 0;
#ifdef  OS_WIN	
	// windows下转换必须先转换为unicode,然后转utf-8	
	DWORD dwRlt = ERROR_SUCCESS;
	WCHAR * newBuf  = NULL;

	try
	{
		int newbuf_maxlen = utf8len * 2 + 1;
		newBuf = new WCHAR[newbuf_maxlen];

		CheckNewRlt(newBuf, newbuf_maxlen * sizeof(WCHAR));


		int unicode_len = MultiByteToWideChar (CP_UTF8, 0,
			utf8buf, utf8len,
			newBuf,newbuf_maxlen);  

		convresult = ::WideCharToMultiByte(CP_ACP, 0,
			newBuf,unicode_len,
			asciibuf, asciimaxlen, NULL, NULL); 
	}
	catch (DWORD dwExp)
	{
		dwRlt = dwExp;
	}
	catch (...)
	{
		dwRlt = ERROR_EXCEPTION_IN_SERVICE;
	}

	SafeDeleteAry(newBuf); 
#endif

#ifdef OS_LINUX

	char * cvt_src_buf = (char *)utf8buf;
	size_t cvt_src_len = utf8len;

	char * cvt_dst_buf = (char *)asciibuf;
	size_t cvt_dst_len = asciimaxlen;			

	convresult = CUnicodeWithAscii::common_conv(enum_coding_cvt_8ta, 
		(char **)&(cvt_src_buf), &cvt_src_len,
		(char **)&(cvt_dst_buf), &cvt_dst_len);	

#endif

	return convresult ;
}

acsii转unicode:

int ascii_to_unicode(const char * asciibuf, int asciilen, 
	WCHAR * unibuf, int unibuflen)
{
	int convresult = 0;
#ifdef  OS_WIN	

	convresult = MultiByteToWideChar(CP_ACP,
		0,
		asciibuf,
		asciilen,  
		unibuf,
		unibuflen);	

#endif

#ifdef OS_LINUX

	char * cvt_src_buf = (char *)asciibuf;
	size_t cvt_src_len = asciilen;

	char * cvt_dst_buf = (char *)unibuf;
	size_t cvt_dst_len = unibuflen * sizeof(WCHAR);			

	convresult = CUnicodeWithAscii::common_conv(enum_coding_cvt_atu, 
		(char **)&(cvt_src_buf), &cvt_src_len,
		(char **)&(cvt_dst_buf), &cvt_dst_len);	

	convresult = convresult / sizeof(WCHAR);

#endif

	return convresult ;
}

unicode转ascii:

int unicode_to_ascii(const WCHAR * unibuf, int unibuflen, 
	char * asciibuf, int asciimaxlen)
{
	int convresult = 0;

#ifdef  OS_WIN

	convresult = ::WideCharToMultiByte(CP_ACP, 0, unibuf,
		unibuflen,asciibuf, asciimaxlen, NULL, NULL);  


#endif

#ifdef  OS_LINUX

	char * cvt_src_buf = (char *)unibuf;
	size_t cvt_src_len = unibuflen * sizeof(WCHAR);

	char * cvt_dst_buf = (char *)asciibuf;
	size_t cvt_dst_len = asciimaxlen;			

	convresult = CUnicodeWithAscii::common_conv(enum_coding_cvt_uta, 
		(char **)&(cvt_src_buf), &cvt_src_len,
		(char **)&(cvt_dst_buf), &cvt_dst_len);	

#endif


	if (convresult < asciimaxlen)
	{
		asciibuf[convresult] = '\0';
	}

	return convresult;

}

utf8转unicode:

int utf8_to_unicode(const char * utf8buf, int utf8len,
	WCHAR * unibuf, int unibuflen)
{
	int convresult = 0;

#ifdef  OS_WIN	

	convresult = MultiByteToWideChar(CP_UTF8,
		0,
		utf8buf,
		utf8len,  
		unibuf,
		unibuflen);	

#endif

#ifdef OS_LINUX

	char * cvt_src_buf = (char *)utf8buf;
	size_t cvt_src_len = utf8len;

	char * cvt_dst_buf = (char *)unibuf;
	size_t cvt_dst_len = unibuflen * sizeof(WCHAR);			

	convresult = CUnicodeWithAscii::common_conv(enum_coding_cvt_8tu, 
		(char **)&(cvt_src_buf), &cvt_src_len,
		(char **)&(cvt_dst_buf), &cvt_dst_len);	


	convresult = convresult / sizeof(WCHAR);

#endif

	return convresult ;
}

unicode转utf8:


int unicode_to_utf8(const WCHAR * unibuf, int unibuflen, char * utf8buf, int utf8maxlen)
{
	int convresult = 0;

#ifdef  OS_WIN

	 convresult = ::WideCharToMultiByte(CP_UTF8, 0, unibuf,
		unibuflen,utf8buf, utf8maxlen, NULL, NULL);  

#endif

#ifdef  OS_LINUX
	 char * cvt_src_buf = (char *)unibuf;
	 size_t cvt_src_len = unibuflen * sizeof(WCHAR);

	 char * cvt_dst_buf = (char *)utf8buf;
	 size_t cvt_dst_len = utf8maxlen;			

	 convresult = CUnicodeWithAscii::common_conv(enum_coding_cvt_ut8, 
		 (char **)&(cvt_src_buf), &cvt_src_len,
		 (char **)&(cvt_dst_buf), &cvt_dst_len);	

#endif

	 return convresult;
	
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: GBK和UTF-8是两种不同的字符编码方式,GBK是中国的编码方式,而UTF-8是一种国际通用的编码方式。在实际开发过程中,由于不同平台和程序使用的编码方式不同,会出现需要进行GBK和UTF-8之间的互转的情况。 在C语言中,实现GBK和UTF-8的互转,可以使用iconv函数。iconv函数是一个系统函数,用于进行字符编码换。在进行换的时候,需要提供源编码和目标编码,同时也需要传入需要进行换的字符串和字符串的长度。 具体的实现过程如下: 1. 获取需要换的字符串和字符串的长度。 2. 定义iconv_t类型的变量,用于存储换方式。 3. 调用iconv_open函数,打开换方式,获取iconv_t类型的变量。 4. 定义一个用于存储换后字符串的char数组和数组长度。 5. 调用iconv函数,将源编码的字符串换为目标编码的字符串。 6. 关闭iconv_t类型的变量。 7. 返回换后的字符串。 下面是一个简单的示例代码: ``` #include <iconv.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char gbk_str[100] = "这是一个GBK编码的字符串"; char utf8_str[100] = {0}; char *inbuf = gbk_str; char *outbuf = utf8_str; size_t inlen = strlen(gbk_str); size_t outlen = strlen(utf8_str); iconv_t ic = iconv_open("utf-8","gbk"); if(ic == (iconv_t)-1) { perror("iconv_open"); exit(1); } int ret = iconv(ic, &inbuf, &inlen, &outbuf, &outlen); if(ret == -1) { perror("iconv"); exit(1); } printf("gbk_str: %s\nutf8_str: %s\n", gbk_str, utf8_str); iconv_close(ic); return 0; } ``` 这段代码将一个GBK编码的字符串换为UTF-8编码的字符串,最终输出换后的字符串。可以看到,使用iconv函数可以非常方便地进行编码换。 ### 回答2: GBK和UTF-8是两种常见的字符编码方式,它们的字节长度和编码规则不同。如何进行互转呢?我们可以通过C语言实现。 首先,需要了解GBK和UTF-8编码的规则。GBK是双字节编码,每个字符占用2个字节,而UTF-8是变长编码,每个字符的字节长度不同,最长可达4个字节。 其次,需要用C语言写出换函数。以将GBK为UTF-8为例,可按如下步骤进行: 1. 定义两个指针,一个指向源字符串GBK,一个指向目标字符串UTF-8。 2. 使用循环遍历GBK字符串中的每个字符。 3. 如果字符的高位为0,表示该字符为ASCII字符,将该字符直接复制到UTF-8字符串中。 4. 如果字符的高位为1,表示该字符为汉字或其他非ASCII字符,需要将该字符为UTF-8编码。 5. 将该字符的二进制形式Unicode编码,再根据以下规则将Unicode编码为UTF-8编码: - 对于1字节的UTF-8编码Unicode编码的范围为U+0000~U+007F; - 对于2字节的UTF-8编码Unicode编码的范围为U+0080~U+07FF; - 对于3字节的UTF-8编码Unicode编码的范围为U+0800~U+FFFF; - 对于4字节的UTF-8编码Unicode编码的范围为U+10000~U+10FFFF。 6. 将得到的UTF-8编码复制到目标字符串UTF-8中,并移动目标字符串指针。 7. 循环结束后,在目标字符串UTF-8的末尾添加一个\0字符,表示字符串的结束。 最后,我们需要注意换时可能会出现一些错误,如GBK字符串中包含非法字符等。因此,在实现时需要对这些情况进行判断和处理。 总的来说,通过以上步骤,我们就能够将GBK字符串为UTF-8编码的字符串了。同样的,我们也可以实现将UTF-8字符串为GBK编码的函数。 ### 回答3: GBK与UTF-8是两种编码格式,GBK适用于汉字编码,UTF-8适用于多语言编码。想要在C语言中进行互转需要先了解一些基本操作。 UTF-8编码格式使用变长字节,一个字符可以由1-4个字节组成,其中第一个字节有特殊标记来表示后面有几个字节是该字符的一部分。而GBK编码格式每个汉字占两个字节。 在C语言中可以使用stdlib.h库函数中的mbstowcs()和wcstombs()来进行编码换。mbstowcs()函数可以将一个字符串换为宽字符数组,wcstombs()函数可以将宽字符数组换为字符串。 将GBK编码格式的字符串换为UTF-8格式需要进行如下操作: 1. 使用mbstowcs()函数将GBK字符串换为宽字符数组。 2. 遍历宽字符数组,使用wcstombs()函数将每个宽字符(即一个汉字或一个英文字母)换为UTF-8格式的字节。 3. 将所有换后的字节组合成一个字符串即为UTF-8格式的字符串。 将UTF-8编码格式的字符串换为GBK格式也需要进行类似的操作: 1. 使用mbstowcs()函数将UTF-8字符串换为宽字符数组。 2. 遍历宽字符数组,使用wcstombs()函数将每个宽字符(即一个汉字或一个英文字母)换为GBK格式的字节。 3. 将所有换后的字节组合成一个字符串即为GBK格式的字符串。 需要注意的是,在进行编码换时可能会出现一些字符无法换的问题,处理方式可以选择忽略该字符或将该字符替换为一个特定字符。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值