C语言字符集转换

#include "codechange.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
#include <locale.h>

wchar_t *ANSITOUnicode(const char* str){
    int textlen = 0;
    wchar_t *result = NULL;
    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 = NULL;
    int textlen = 0;
    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 = 0;
    wchar_t *result = NULL;
    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 = NULL;
    int textlen = 0;
    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;
}

wchar_t* m2w(const char* mbs){
    int len = 0;
    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));
}

时间: 2024-08-02 14:57:26

C语言字符集转换的相关文章

libiconv字符集转换库在C#中的使用

<libiconv字符集转换库使用方法>一文中说到了libiconv可以实现不同字符集的转换.比如GBK转BIG5等.在项目中因为需要,找到这个库.可是这个库在C#中没有很好的支持.不过,想着既然是C++的库,那只要动态加载DLL的接口就好了.可是调用并不顺利,传进去的IntPtr或者byte数组总是拿不到数据.后面回到了C++的方式去调用,几经调试,总算找到了原因. 是iconv接口在转换完成后,指针的位置往后移了.而在C#中调用DLL后回来的指针,已经是移动后的,所以拿不到所要的数据. 经

C语言颜色转换宏

C语言颜色转换宏 #define COLOR_BPP16_RGB555 /* Win RGB */ #define COLOR_RGB(r,g,b) ((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16))) #define COLOR_RGBA(r,g,b,a) ((COLORREF)((((DWORD)(BYTE)(a))<<24)|COLOR_RGB(r,g,b))) /* W

iconv_open函数申请一个字符集转换的描述符

iconv_open函数 iconv_open函数 iconv_open——申请一个字符集转换的描述符 #include <iconv.h> iconv_t iconv_open(const char* tocode,const char* fromcode) 描述: iconv_open()函数申请一个转换描述符,转换字符序列从编码fromcode到编码tocode 转换描述符包含转换状态,调用iconv_open创建以后,转换状态处于初始状态,调用iconv函数以后改变转换描述符的转换状态

Python任意字符集转换

在python处理文本的过程中,经常会有文本字符集转换的情况, 而我们希望用一个方法,不用关心文本原本的字符集是什么样的,直接转换成想要的任何字符集就可以了. 方法一: import chardet def convert_encoding(data,new_coding='UTF-8'): # 任意字符集转换 encoding = chardet.detect(data)['encoding'] if new_coding.upper() != encoding.upper(): data =

字符集转换引发插入乱码问题

根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect string value: '\x91;offl...' for column 'c' at row 1 重现: 1)连接MySQL字符集是UTF8 mysql --default-character-set=utf8 test 2)表结构 CREATE TABLE `abc` ( `id` int(1

Oracle字符集转换

这几天在工作中碰到一个字符乱码的问题,发现在cmd窗口的sqlplus中直接update一个中文和使用@调用一个文件作同样更新的时候,存储的结果 竟不一样.一时比较迷惑,对Oracle如何处理各个字符集的问题不是很清楚.特此通过一些资料和实验总结,系统学习一下Oracle中字符集的相关知 识. 一. 字符集的基础知识:在网络上已有不少网友对字符集进行了研究,个人觉得有几个不错的网站可以参考http://blog.csdn.net/tianlesoftware/article/details/49

Lazarus 字符集转换 Utf8ToAnsi,UTF8ToWinCP,UTF8ToSys,UTF8ToConsole

由于Lazarus从1.2版开始默认字符集就是UTF8,如果要转到系统正常显示或文本保存,就必须对字符集进行转换.Lazarus提供了很多函数.如题. 那么这里面有什么关系呢? UTF8ToSys 需要 启用编译参数 –dDisableUTF8RTL,否则还是UTF8,如果变码还是Utf8ToAnsi,但做了基本的处理. 对应代码 function UTF8ToSys(const s: string): string; begin {$IFDEF UTF8_RTL} Result:=s; {$E

【Teradata】Latin和Unicode字符集转换(自定义函数udf_w936to16和udf16tow936)

1.安装UDF函数 (1)下载GBK2Unicode.zip,地址为https://downloads.teradata.com/tag/udf (2)windows或者Linux环境下使用bteq进行安装. 进入文件所在目录,输入如下命令(windows中使用dos) bteq .logon 192.168.253.222/citic_edw 输入口令后,输入如下命令 database syslib; .run file=16_936.sql 验证syslib库中是否存在udf_w936to1

易语言指针转换及调用方法

取变量数据地址(变量) '//转换成指针类型,结果(整数型),注意变量不能使用控件属性带入.变量可以为[整数 字符 字节集等] 指针到字节集(整数型变量,长度) '//获取以上转换的整数型[指针]指向的数据,结果为[字节集], 长度为欲转换的长度. DLL例子 ===================================== <<DLL部分>> <<程序调用部分>> ABC 为 字节集变量 PlayXM (取变量数据地址 (ABC), 取字节集长度