ENGLISH 意见建议 网站地图 网站帮助
广泛智力汇聚   高效成果传播   先进机制培育
联盟首页  |  协同开发  |  开放源码库  |  安全告警  |  开源导航  |  文档中心  |  服务支持  |  共创论坛  |  关于联盟


注册会员 网站帮助
    您的位置 »
    今天是: 2010年11月22日    
项目搜索

完全匹配   
开源软件
软件分类表
新发布软件
其它网站镜像
代码片断
协同开发
文档
论坛
寻求协助
热点项目
站点状态
编译工厂

联系我们
关于联盟

代码片段库:
查看代码片段

浏览 | 提交新的代码片段 | 创建代码包

多字节函数库系列:UTF-8相关:toutf8()

类型:
Function
类别:
Other
许可证:
GNU Library Public License
语言:
C++
 
描述:
将任何编码(系统支持的)字符串通过iconv()函数转换为UTF-8编码字节序列。

该代码片段的版本系列:

片段ID 下载版本 提交时间 提交人 删除
45730.12002-06-26 21:04renxiao

点击"下载版本"来下载该代码片段.


最新版本的代码片段: 0.1


/*-------------------------Own_lib函数库系列 toutf8.cc------------------------
cy_toutf8() /toutf8.o /libcyfunc.a

描述: 将任何编码(系统支持的)字符串通过iconv()函数转换为UTF-8编码字节序列.
      下一函数为重载函数, 增加了用于返回源字符串实际转换字节数的参数引用.
out_buf:
      转换的目标字符串空间指针.
buf_len:
      保存目标字符串的内存空间的大小(包括末尾的'\0'字符空间), 按字节计算.
in_str:
      被转换的源字符串指针.
in_code:
      被转换的源字符串编码.
[in_len]:
      用于返回已经被转换的源字符串的字节数(不包括结尾符'\0').
conv_begin = false:
      对于有"状态改变"的编码系统, 在处理连续分段字符串时, 第一次请置其为true.
返回值:
      返回转换后的UTF-8编码字符串的字节数. 若遇到错误返回-1, 若遇到非法字节序列
      或buf_len不足(in_str中还有非空字符待转换), 返回0.

注意! 1. 用iconv()函数转换不同编码字符串时, 与系统LC_CTYPE/locale无关.
      2. 当遇到非法字节序列或buf_len小于转换字符串需要的长度而返回0时, dest_str
         中保存有已经正常转换的字符串(在串的正确位置已有'\0'结束符).

作者: 任逍 |2002.05.26.
版权: GNU General (Library) Public License (GPL/LGPL)

* 编辑器: vim-6.0 |操作系统: TurboLinux7.0简体中文版 *
------------------------------------------------------------------------------*/

#include <string.h>  	// use for strlen()
#include <iconv.h>   	// use for iconv_open()/iconv()iconv_close()

#include "cyinclude/cyutf.h"


size_t  cy_toutf8(char * out_buf, 
                  size_t buf_len,
                  const char * in_str, 
                  const char * in_code, 
                  bool conv_begin = false)
{
	static iconv_t	its_conv;
	if ( (its_conv = iconv_open("UTF-8", in_code)) == (iconv_t)-1 )
		return (size_t)-1;
	if (!in_str)
		return (size_t)-1;
	if (conv_begin)
		iconv(its_conv, NULL, NULL, NULL, NULL);

	const char *	instr = in_str;
	size_t	inlen = strlen(in_str) + 1;
	char *	outstr = out_buf;
	size_t	outlen = buf_len - 1;
	size_t	ret_conv = 0;
	ret_conv = iconv(its_conv, &instr, &inlen, &outstr, &outlen);
		// 当outlen长度不足时, iconv()也返回-1
	iconv_close(its_conv);

	if ( (ret_conv == (size_t)-1) || (inlen == 1) )
		outstr[0] = '\0';	// 字符串末尾补充结束符'\0'

	if (inlen == 1)	// 此句必须在下句前
		return (buf_len - 1 - outlen);
	if (ret_conv == (size_t)-1)
		return 0;

	return (buf_len - 2 - outlen);
}
//------------------------------------------------------------------------------


// 上一函数的重载函数

size_t  cy_toutf8(char * out_buf, 
                  size_t buf_len,
                  const char * in_str, 
                  const char * in_code,
                  size_t & in_len,	//!
                  bool conv_begin = false)
{
	static iconv_t	its_conv;
	if ( (its_conv = iconv_open("UTF-8", in_code)) == (iconv_t)-1 )
		return (size_t)-1;
	if (!in_str)
		return (size_t)-1;
	if (conv_begin)
		iconv(its_conv, NULL, NULL, NULL, NULL);

	const char *	instr = in_str;
	size_t	inlen, save_len;
	inlen = save_len = strlen(in_str) + 1;
	char *	outstr = out_buf;
	size_t	outlen = buf_len - 1;
	size_t	ret_conv = 0;
	ret_conv = iconv(its_conv, &instr, &inlen, &outstr, &outlen);

	iconv_close(its_conv);

	if (inlen == 0)
		in_len = (save_len - 1) - inlen;
	else
		in_len = save_len - inlen;

	if ( (ret_conv == (size_t)-1) || (inlen == 1) )
		outstr[0] = '\0';	// 字符串末尾补充结束符'\0'

	if (inlen == 1)
		return (buf_len - 1 - outlen);
	if (ret_conv == (size_t)-1)
		return 0;

	return (buf_len - 2 - outlen);
}

		

提交新版本

如果您修改了一个代码片段并且觉得很应该让别人共享,您可以把这作为这个代码片段的最新版本提交上来.


联盟团体会员
合作伙伴
© 共创软件联盟 版权所有
联盟服务条款 | 联盟隐私权规则 | 联系我们
电话: (8610)68313388-5949 | 传真: (8610)88377936
京ICP备05056057号