字符串处理 - ANSI - Unicode - UTF8 转换

本文深入探讨了字符编码转换的方法,包括ANSI到Unicode、UTF-8到Unicode等常见编码之间的转换,并提供了详细的C语言实现代码。通过实例展示了如何读取和转换文件编码,适用于需要处理多编码环境的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <windows.h>
#include <locale.h>
#define BUFF_SIZE 1024
  
wchar_t * ANSIToUnicode(const char* str)
{
    int textlen ;
    wchar_t * result;
    textlen = MultiByteToWideChar(CP_ACP, 0, str,-1, NULL, 0);
    result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
    memset(result,0,(textlen+1)*sizeof(wchar_t));
    MultiByteToWideChar(CP_ACP, 0, str, -1, (LPWSTR)result, textlen);
    return result;
}
  
char * UnicodeToANSI(const wchar_t* str)
{
    char* result;
    int textlen;
    textlen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
    result = (char *)malloc((textlen+1)*sizeof(char));
    memset(result, 0, sizeof(char) * (textlen + 1));
    WideCharToMultiByte(CP_ACP, 0, str, -1, result, textlen, NULL, NULL);
    return result;
}
  
wchar_t * UTF8ToUnicode(const char* str)
{
    int textlen;
    wchar_t * result;
    textlen = MultiByteToWideChar(CP_UTF8, 0, str,-1, NULL, 0);
    result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));
    memset(result,0,(textlen+1)*sizeof(wchar_t));
    MultiByteToWideChar(CP_UTF8, 0, str, -1, (LPWSTR)result, textlen);
    return result;
}
  
char * UnicodeToUTF8(const wchar_t* str)
{
    char* result;
    int textlen;
    textlen = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL);
    result = (char *)malloc((textlen+1)*sizeof(char));
    memset(result, 0, sizeof(char) * (textlen + 1));
    WideCharToMultiByte(CP_UTF8, 0, str, -1, result, textlen, NULL, NULL);
    return result;
}

/*宽字符转换为多字符Unicode - ANSI*/
char* w2m(const wchar_t* wcs)
{
    int len;
    char* buf;
    len = wcstombs(NULL,wcs,0);
    if (len == 0)
        return NULL;
    buf = (char *)malloc(sizeof(char)*(len+1));
    memset(buf, 0, sizeof(char) *(len+1));
    len = wcstombs(buf, wcs, len+1);
    return buf;
}

/*多字符转换为宽字符ANSI - Unicode*/
wchar_t* m2w(const char* mbs)
{
    int len;
    wchar_t* buf;
    len = mbstowcs(NULL, mbs, 0);
    if(len == 0)
    	return NULL;
    buf = (wchar_t *)malloc(sizeof(wchar_t)*(len+1));
    memset(buf, 0, sizeof(wchar_t)*(len+1));
    len = mbstowcs(buf, mbs, len+1);
    return buf;
}
  
char* ANSIToUTF8(const char* str)
{
    return UnicodeToUTF8(ANSIToUnicode(str));
}
  
char* UTF8ToANSI(const char* str)
{
    return UnicodeToANSI(UTF8ToUnicode(str));
}
  
int main()
{
    /*使用wcstombs和mbstowcs之前必须调用setlocale,以便决定内码*/
    setlocale(LC_ALL,".936");
    /*假定有一个Unicode(UTF-16LE)编码的文件,将其打开,重新编码为ANSI,写入aa.txt中,
    /*再继续编码回Unicode,写入aw.txt中*/
    /*如果不存在a.txt文件,则程序出错,没有做错误处理*/
    char* filename = "a.txt";
    char* filenamea = "aa.txt";
    char* filenamew = "aw.txt";
    FILE*     input=fopen( filename, "rb");
    FILE*     inputa=fopen( filenamea, "wb");
    FILE*     inputw=fopen( filenamew, "wb");
    wchar_t * buf;
    /*BOE设置,UTF-16LE的BOE为FEFF,如果不先将其读取出来,wcstombs会调用失败*/
    fgetwc(input);
    fputwc(0xFEFF, inputw);
    /*开始读取文件*/
    while(!feof(input))
    {
       buf = (wchar_t *)malloc(sizeof(wchar_t)*BUFF_SIZE);
       memset(buf, 0, sizeof(wchar_t) * BUFF_SIZE);
       fgetws(buf, BUFF_SIZE, input);
       fputs(w2m(buf), inputa);
       fputws(m2w(w2m(buf)), inputw);
    }
    /*后续处理*/
    fclose(input);
    fclose(inputa);
    fclose(inputw);
    free(buf);
 
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值