LINUX C ANSI 转 UTF8

zhouxm2003 2012-12-07 11:48:17
LINUX C 中 需要将ANSI 转 UTF8 ,怎么转换呢?

我使用 mbstowcs 时,编译会报:
`mbstowcs' undeclared (first use this function)
其中头文件已包含:#include <stdlib.h>

ANSI -》 UTF8
...全文
1211 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
爱碎碎念 2013-03-28
  • 打赏
  • 举报
回复
使用g_convert(string, -1, "utf-8", "ansi", NULL, NULL, NULL)试试。
赵4老师 2012-12-10
  • 打赏
  • 举报
回复
//iconv_linux下字符集编码转换轻松实现
(1) iconv_t iconv_open(const char *tocode, const char *fromcode);
//此函数说明将要进行哪两种编码的转换,tocode是目标编码,fromcode是原编码,该函数返回一个转换句柄,供以下两个函数使用。
(2) size_t iconv(iconv_t cd,char **inbuf,size_t *inbytesleft,char **outbuf,size_t *outbytesleft);
//此函数从inbuf中读取字符,转换后输出到outbuf中,inbytesleft用以记录还未转换的字符数,outbytesleft用以记录输出缓冲的剩余空间。
(3) int iconv_close(iconv_t cd);
//此函数用于关闭转换句柄,释放资源。

//例子1: 用C语言实现的转换示例程序

/* f.c : 代码转换示例C程序 */
#include <iconv.h>
#define OUTLEN 255
main()
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char *in_gb2312 = "正在安装";
char out[OUTLEN];

/*unicode码转为gb2312码*/
rc = u2g(in_utf8,strlen(in_utf8),out,OUTLEN);
printf("unicode-->gb2312 out=%sn",out);
//gb2312码转为unicode码

rc = g2u(in_gb2312,strlen(in_gb2312),out,OUTLEN);
printf("gb2312-->unicode out=%sn",out);
}
/*代码转换:从一种编码转为另一种编码*/
int code_convert(char *from_charset,char *to_charset,char *inbuf,int inlen,char *outbuf,int outlen)
{
iconv_t cd;
int rc;
char **pin = &inbuf;
char **pout = &outbuf;

cd = iconv_open(to_charset,from_charset);
if (cd==0) return -1;
memset(outbuf,0,outlen);
if (iconv(cd,pin,&inlen,pout,&outlen)==-1) return -1;
iconv_close(cd);
return 0;
}
/*UNICODE码转为GB2312码*/
int u2g(char *inbuf,int inlen,char *outbuf,int outlen)
{
return code_convert("utf-8","gb2312",inbuf,inlen,outbuf,outlen);
}
/*GB2312码转为UNICODE码*/
int g2u(char *inbuf,size_t inlen,char *outbuf,size_t outlen)
{
return code_convert("gb2312","utf-8",inbuf,inlen,outbuf,outlen);
}

//例子2: 用C++语言实现的转换示例程序

/* f.cpp : 代码转换示例C++程序 */
#include <iconv.h>
#include <iostream>

#define OUTLEN 255

using namespace std;

// 代码转换操作类

class CodeConverter {

private:
iconv_t cd;
public:

// 构造
CodeConverter(const char *from_charset,const char *to_charset) {
cd = iconv_open(to_charset,from_charset);
}


// 析构
~CodeConverter() {
iconv_close(cd);
}


// 转换输出
int convert(char *inbuf,int inlen,char *outbuf,int outlen) {
char **pin = &inbuf;
char **pout = &outbuf;

memset(outbuf,0,outlen);
return iconv(cd,pin,(size_t *)&inlen,pout,(size_t *)&outlen);
}
};

int main(int argc, char **argv)
{
char *in_utf8 = "姝e?ㄥ??瑁?";
char *in_gb2312 = "正在安装";
char out[OUTLEN];

// utf-8-->gb2312
CodeConverter cc = CodeConverter("utf-8","gb2312");
cc.convert(in_utf8,strlen(in_utf8),out,OUTLEN);
cout << "utf-8-->gb2312 in=" << in_utf8 << ",out=" << out << endl;

// gb2312-->utf-8
CodeConverter cc2 = CodeConverter("gb2312","utf-8");
cc2.convert(in_gb2312,strlen(in_gb2312),out,OUTLEN);
cout << "gb2312-->utf-8 in=" << in_gb2312 << ",out=" << out << endl;
}



二、利用iconv命令进行编码转换

iconv命令用于转换指定文件的编码,默认输出到标准输出设备,亦可指定输出文件。

用法: iconv [选项...] [文件...]

有如下选项可用:

输入/输出格式规范:
-f, --from-code=名称 原始文本编码
-t, --to-code=名称 输出编码

信息:
-l, --list 列举所有已知的字符集

输出控制:
-c 从输出中忽略无效的字符
-o, --output=FILE 输出文件
-s, --silent 关闭警告
--verbose 打印进度信息

-?, --help 给出该系统求助列表
--usage 给出简要的用法信息
-V, --version 打印程序版本号

例子:
iconv -f utf-8 -t gb2312 aaa.txt >bbb.txt
这个命令读取aaa.txt文件,从utf-8编码转换为gb2312编码,其输出定向到bbb.txt文件。

小结: Linux为我们提供了强大的编码转换工具,给我们带来了方便。


qq120848369 2012-12-09
  • 打赏
  • 举报
回复
iconv,POSIX标准编码转换。
NAME
       iconv - codeset conversion function

SYNOPSIS
       #include <iconv.h>

       size_t iconv(iconv_t cd, char **restrict inbuf,
              size_t *restrict inbytesleft, char **restrict outbuf,
              size_t *restrict outbytesleft);
子善旬 2012-12-09
  • 打赏
  • 举报
回复
抱歉,把ansi与ascii混淆了 把以下代码修改下(来自:http://blog.csdn.net/saokeliu/article/details/5192937)

char* encodeConv::GB2UTF_8(char *p_srcStr)
{
         char* p_desStr = NULL;
         assert(NULL != p_srcStr);
 
         int isrcLen = strlen(p_srcStr);
         int idesLen = isrcLen*2;
         int x = 0;
         int y = 0;
         short s_Temp = 0;
         p_desStr = new char[idesLen];
         memset(p_desStr,0,idesLen*sizeof(char));
         char chighChar = 0;
         char clowChar = 0;
         char *p_TempStr = p_desStr;
         for(int k = 0;k < idesLen;k++)
         {
                   printf("%x ",*(p_srcStr+k));
         }
         printf("/n");
         while ('/0' != *p_srcStr)
         {
                   if(((unsigned char)*(p_srcStr))>=0xA0)
                   {
                            printf("%s %d %x %x/n",__FILE__,__LINE__,*(p_srcStr+1),*p_srcStr);
                            //gb2312转unicdoe
chighChar = *p_srcStr-0xB0;//大端序
                            clowChar = *(p_srcStr+1)-0xA0;//
                            x = (int)chighChar;
                            y = (int)clowChar;
                            s_Temp = Unicode[x][y];//取unicode编码
                            printf("%s %d %d %d %d/n",__FILE__,__LINE__,x,y,s_Temp);
                            //unicdoe转utf-8
                            chighChar= (0xff00&s_Temp)>>8;
                            clowChar= (0x00ff&s_Temp);
                            char cTemp[3];
                            printf("%s %d %x %x/n",__FILE__,__LINE__,chighChar,clowChar);
                            cTemp[0] = 0xE0 | ((0xF0 & chighChar)>>4);
                            cTemp[1] = 0x80 | (((0x0F & chighChar)<<2) | ((0xC0 & clowChar)>>6));
                            cTemp[2] = 0x80 | (0x3F & clowChar);
                            printf("%s %d %x %x %x/n",__FILE__,__LINE__,cTemp[0],cTemp[1],cTemp[2]);
                            memcpy(p_desStr,cTemp,sizeof(cTemp));
                           
                            p_desStr += 3;                   
                            p_srcStr += 2;
                   }
                   else
                   {
                            memcpy(p_desStr,p_srcStr,1*sizeof(char));
                            p_srcStr +=1;  
                            p_desStr += 1;
                   }
         }
         idesLen = strlen(p_TempStr);
         for(int j = 0;j < idesLen;j++)
         {
                   printf("%x ",*(p_TempStr+j));
         }
         return p_TempStr;//记得外面要delete []p_TempStr;
        
}
zhouxm2003 2012-12-08
  • 打赏
  • 举报
回复
相同?没有吧 比如: "氨气" ANSI编码 : BO B1 C6 F8 UTF8编码 : E6 B0 A8 E6 B0 94
zhouxm2003 2012-12-08
  • 打赏
  • 举报
回复
自己顶了,,,
子善旬 2012-12-08
  • 打赏
  • 举报
回复
LINUX C 中 需要将ANSI 转 UTF8 不用转, ANSI与UTF8相同 unicode、gb2312等等转utf8, 才要写代码
zhouxm2003 2012-12-08
  • 打赏
  • 举报
回复
哎,,这转码就是搞死人的,,头大
youkuxiaobin 2012-12-08
  • 打赏
  • 举报
回复
遇到这种转码的就想骂街
zhouxm2003 2012-12-08
  • 打赏
  • 举报
回复
感谢大家。 主要是需要应用到嵌入式linux中,所以需要纯C方式实现。 有纯C的方法将ANSI 转成 UNICODE 吗? UNICODE 到UTF8 有C方法实现
牧童027 2012-12-08
  • 打赏
  • 举报
回复
mbstowcs只能将单字节的转双字节即 char --> wchar_t 不能完成楼主要求的ANSI --> UTF8的转换吧。 还是使用iconv函数来实现吧,楼主可参看下面这个euc2utf8的例子。 http://www.lemoda.net/c/iconv-example/iconv-example.html
羽飞 2012-12-08
  • 打赏
  • 举报
回复
引用 2 楼 wallwind 的回复:
iconv -f ANSI -t UTF-8 ./file1 -o ./file2 给分吧
施主,没看清题,撸主是说用C语言自己写
wintree 2012-12-08
  • 打赏
  • 举报
回复
iconv -f ANSI -t UTF-8 ./file1 -o ./file2 给分吧
说明: 除非特别声明,所有程序均使用VC++6.0 MFC编写。 所有程序均为练手用,放弃一切权利,同时不承担任何责任。 显式遵照 GPL v3.0标准。 QuoteCorrection 20110722 1119.7z 处理 清风徐来 水波不兴 邮件使用,将 西文 "" 换为 “” 原理:ASC UNICODE(修改) ASC。 处理文件夹。 CSourceCodeEdit X4括号判断末行 20110721 1216.7z C语言源代码格式化。 处理文件夹。 PLT2KMLX14解决最后一行的问题 20110721 0931.7z PLT2KML 改CString完工 20120731 1632.7z PLT2KML 20110811 1047 处理单文件.7z PLT2KML 20120813 1815 处理子目录.7z PLT2KML 20120831 0934 处理子目录.7z WPT2KMLx4解决空行末行 20110721 0948.7z WPT2KML 改CString完工 20120731 1700.7z WPT2KML 全部改CString慢 改strcat慢 20120801 1338.7z WPT2KML 全部改CString慢 改strcat慢 20120801 1559.7z WPT2KML 完成 20120802 1718.7z WPTPLT2KMLx12PLTWPT初步 20110721 1006.7z WPTPLT2KML 基本完工 20120801 1618.7z WPTPLT2KML 删除原始PLTWPT文件 20120802 0908.7z WPTPLT2KML 修正WPT 20120802 1725.7z OZI格式的轨迹文件KML格式的轨迹文件。 原理:ASC(换) UNICODE UTF-8。 处理子目录 WPT完成CFile改造成CreateFile SubtitleENCN 20110726 1924.7z 剔除中英文字幕中的中文。 原理:ASC UNICODE(剔除中文) 回ASC。 StringArrayBuildX10排版完成 20110728 0853.7z UNICODE 0-65535 中汉字的拼音。 从 CnToSpell.java 中提取的拼音。 StringArrayX6汉字拼音 20110729 1418 拼音库需要修正.7z 汉字拼音 原理:ASC UNICODE(汉字拼音) 回ASC。 TXTEditEnterX1单文件排版 20110729 1902.7z 排版用 原理:ASC UNICODE(排版) 回ASC(替换掉原来的文件)。 doyouhikeList 磨房报名人员ID格式化后发悄悄话 20110729 1856.7z 磨房报名人员ID格式化后发悄悄话 原理:ASC UNICODE(排版) 回ASC(替换掉原来的文件)。 DOC2TXTEdit 20110919 1753.7z 处理PDF的文件TXT后的换行问题。==末尾是空格不用处理的。 原理:ASC UNICODE(行的结尾只要不是汉字就换行) 回ASC。 PLTClear 清除PLT文件夹的名 20111006 1912.7z 处理 GPXPLT之后, OziExplorer Track Point File Version 2.1 WGS 84 Altitude is in Feet Reserved 3 0,2,255, $$$$$$ ,0,0,2,8421376 文件名会显示在 GM 做的地图里。清除掉 原理:ASC UNICODE(修改) ASC。 处理文件夹。 AngleBracketsSubtitle 20111006 1935.7z 处理 清除字幕中的字体、颜色标记。 原理:ASC UNICODE(修改) ASC。 处理文件夹。 UTF82ANSI 20111006 2008.7z 处理 将 UTF-8 格式的 字幕(或者文件) ANSI 格式。 原理:UTF-8 2 UNICODE 2 ANSI。 处理文件夹。 GPX2KML 20120102 1630.7z 处理 将 UTF-8 格式的 字幕(或者文件) ANSI 格式。 原理:查找坐标点, 然后由ANSI 2 UNICODE 2 UTF-8。 处理文件夹。 258.000000 3.666667 FileFolderGenerate 20120112 1514.7z 文件夹生成函数CreateDirectory的测试。 功能:在指定目录下生成256个文件夹,每个文件夹内生成256个32K的文本文件,内容为“A”。 FileGenerate 20111121 1641.7z 功能: 猜想:对于“8.3格式文件”的文件名,(也许是出于向后兼容的目的),操作系统总是尝试以“大写”的文件名保存,小写的文件名或者扩展名也用大写表示,然后在“文件登记项”的32B的第13个字节(偏移量为0x0C)标识。于是检验大小写文件名对可创建的文件数量的影响。 还是将电脑的最后一个分区格式化为 FAT32 格式。(为了保证一般性,不是在“根目录下”检验的,相信也同样适合于根目录。) 然后使用如下四种读写文件的方法进行测试, 1、C语言函数fopen(),UNICODE版本是 _wfopen()。 2、C++ fstream 3、mfc CFile、CStdioFile类 4、采用WinCE的API CreateFile 其中每种方式都检测9种情况: 文件名大写.扩展名大写(B1)、文件名大写.扩展名小写(B2)、文件名大写.扩展名混写(B3) 文件名小写.扩展名大写(B4)、文件名小写.扩展名小写(B5)、文件名小写.扩展名混写(B6) 文件名混写.扩展名大写(B7)、文件名混写.扩展名小写(B8)、文件名混写.扩展名混写(B9) shuangseqiu 20120226 1931.7z shuangseqiu 双色球 20120802 1728.7z shuangseqiu 清注释完成20120810 1049.7z 功能: 寻找双色球的蓝球的间隔规律。 单文件处理。 CreateFile读取文件并进行处理。 CreateFile写入文件,以供分析之用。 FileNumber 20111028 2219.7z 功能: 给文件编号。(文件有遗漏。) CreateFile读取文件。 CFile写入文件。(==修正为CreateFile) !!!!KMLPointReverse 20111006 2205.7z !!!!KMLPointReverse 20120831 0951.7z 功能: 编辑KML格式的GPS轨迹的时候,将轨迹点前后倒置! CSourceCodeEnter 20120229 1759.7z 由 CSourceCodeEdit X4括号判断末行 20110721 1216.7z 简单修正而得!加入了对“#”的处理。(很多编辑器、很多人喜欢用回车而不喜欢用换行符号!) C语言源代码格式化。 处理文件夹。 CSourceCodeEnterFile 20120611 0914.7z 处理文件 CSourceCodeEnterFile WriteFile 20120713 0930.7z CSourceCodeEnterFile WriteFile TRUNCATE_EXISTING 20120718 0938.7z Comma2Enter 20120614 1626.7z 将????分隔的文本文件改为回车换行分隔。 处理文件。 rgb32bmpFile 640x480 20120713 1331.7z 640x480BMP文件 处理单文件 RGB32BMP 20120713 1347.7z 640x480BMP文件 处理文件夹 EXTnamebig2small 扩展名更改-外部申请内存块 b2s s2b 20120718 1344.7z 文件名扩展的大写←→小写换。 递归调用处理子目录 YUYV2BMP 20120723 1109 算法1.7z YUYV的数据换成RGB的数据成功 递归调用处理子目录 BrowseDirectoryTree 20120718 1026.7z ListAllFileInDrectory 20120723 1317.7z 子目录浏览 nst2kml 20120802 1925.7z 处理子目录 AddQuote 20120810 1016.7z a → 'a'; 处理单文件 kmlA2Space 20120813 1124.7z kmlA2Space 20120813 2345.7z 功能:将Ourxmaps生成的以0x0A分隔的KML文件化为空格分隔的KML文件 UTF8 UNICODE ANSI之后进行处理,处理完之后,ANSI UNICODE UTF-8 保存。 处理子目录 A2DA 20120831 0939.7z DA2A 20120831 0939.7z 功能:单文件处理,WINDOWS/LINUX下的回车换行的处理。
项目中有很多文件因为编码的原因导致用户使用的时候看到的是乱码,或是不兼容的情况,网上找了一圈 也没有适合咱程序员的码的工具,所以写了一个批量换工具 虽然已经使用在我司生产项目中,但还是建议你换前备份一次文件 注意(使用前必看): 注意(使用前必看): 注意(使用前必看): 支持所有文本格式的文档(如 txt,js,css,java,c..),二进制或程序(如word,excel,exe文件)不要使用本换工具,因为是JAVA程序 需要你的机器上已经安装了JDK 使用方法: 1,打开start.sh文件,windows用户把扩展名.sh修改为.bat 2,修改三个双引号("")中的参数, 第一个参数是文件夹路径, 第二个参数表示要换成的编码 如utf-8,utf-8-bom,ansi 等编码都支持 第二个参数表示要换的文件类型,以扩展名的形式提供支持,可以提供多个文件扩展名 以空格分隔 如:我要换E盘下 E:\work_architecture\doc目录下的所有js 和 css 文件 编码为 utf-8 那么,你要执行的命令就是 java -jar code_conversion.jar "E:\work_architecture\doc" "utf-8" ".js .css" 还是挺简单的吧~~ 支持的功能: 1,批量换,子目录自动发现 2,文件编码自动识别,所以使用的时候不用提供原文件的编码;识别不了不会换,保证项目文件的安全 3,支持utf-8-bom编码 4,兼容Linux & Windows & Mac系统 5,不用安装,只要机器有JDK就可以使用 需要源码的请邮件jidaqiana@163.com 或 私信我

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧