CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

如何用 C 写入 UTF-8 格式的文件?

楼主hszr(随风)2006-07-03 17:51:57 在 C/C++ / C语言 提问

如题,要求把文件用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

相关问题

关键词

得分解答快速导航

  • 帖主:hszr
  • jixingzhong

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo