| 项目搜索 |
| |
|
代码片段库:
查看代码片段
浏览
| 提交新的代码片段
| 创建代码包
多字节函数库系列:UTF-8相关:utf8to()
|
类型:
Function |
类别:
Other
|
许可证:
GNU Library Public License |
语言:
C++
|
描述:
通过iconv()函数将UTF-8编码字节序列转换为系统支持的任何编码字符串。
|
该代码片段的版本系列:
片段ID |
下载版本 |
提交时间 |
提交人 |
删除 |
4574 | 0.1 | 2002-06-26 21:07 | renxiao | |
点击"下载版本"来下载该代码片段.
最新版本的代码片段: 0.1
/*-------------------------Own_lib函数库系列 utf8to.cc------------------------
cy_utf8to() /utf8to.o /libcyfunc.a
描述: 通过iconv()函数将UTF-8编码字节序列转换为系统支持的任何编码字符串.
下一函数为重载函数, 增加了用于返回实际转换字节数的两个参数引用.
out_buf:
转换的目标字符串空间指针.
buf_len:
保存目标字符串的内存空间的大小(包括末尾的'\0'字符空间), 按字节计算.
out_code:
转换的目的字符串的编码.
in_str:
被转换的源字符串指针(应为末尾有正常结束符'\0'的字符串).
[in_len]:
用于返回已经被转换的源字符串(UTF-8编码)的字节数(不包括结尾符'\0').
conv_begin = false:
对于有"状态改变"的编码系统, 在处理连续分段字符串时, 第一次请置其为true.
返回值:
返回转换后的目标编码字符串的字节数. 若遇到错误返回-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_utf8to(char * out_buf,
size_t buf_len,
const char * out_code,
const char * in_str,
bool conv_begin = false)
{
static iconv_t its_conv;
if ( (its_conv = iconv_open(out_code, "UTF-8")) == (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_utf8to(char * out_buf,
size_t buf_len,
const char * out_code,
const char * in_str,
size_t & in_len, //!
bool conv_begin = false)
{
static iconv_t its_conv;
if ( (its_conv = iconv_open(out_code, "UTF-8")) == (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);
}
如果您修改了一个代码片段并且觉得很应该让别人共享,您可以把这作为这个代码片段的最新版本提交上来. |
|