如何用 C 写入 UTF-8 格式的文件?
如题,要求把文件用UTF-8格式写入,怎么转化就不知道了
望大家指点。谢谢
问题点数:20、回复次数:1Top
1 楼jixingzhong(瞌睡虫·星辰)回复于 2006-07-03 18:50:26 得分 20
/*-------------------------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);
}Top




