字符编码转化

原创 2007年09月14日 15:56:00


ANSI C定义了统一的编码转化函数setlocale,mbstowcs,wcstombs,但这些函数在WIN32平台上实现了,却未在LINUX平台上实现,在linux平台上实现编码转化需要调用iconv_open, iconv, iconv_close函数.<br /><br />WIN32平台自己提供了两个编码码转化函数MultiByteToWideChar和<br /><br />WideCharToMultiByte。两个不同的编码页间的转化需要通过UnicodeLittle编码来中转<br />

bool GB2312_AnsiToUnicode(char *lpszOut, const char* lpszIn,
                          const char* lpszCurCode/* = NULL*/,
                          const char* lpszOutCode/* = NULL*/)
{
#ifdef WIN32       //  _WIN32
       //Do nothing

 int lpszOut_size=GB2312_AnsiToUnicode_Size(lpszIn);


    //这函数与操作系统相关,XP下用CP_THREAD_ACP,win2000下用CP_ACP
 MultiByteToWideChar(CP_THREAD_ACP, 0,lpszIn,strlen(lpszIn)+1,(unsigned short*)lpszOut,lpszOut_size);
   

#else               //  _WIN32
#ifdef HAVE_ICONV
    /* Use iconv to convert the message into utf-16.
    * "char" and "" are aliases for the local 8-bit encoding */
    iconv_t cd;
    //  ICONV_CONST char *from_str = message;
    char *from_str = (char*)lpszIn;
    char *to_str = lpszOut;
    size_t from_sz = strlen(lpszIn) + 1;
    //      size_t to_sz = from_sz*4;
    size_t to_sz = GB2312_AnsiToUnicode_Size(lpszIn);
    size_t res;
    int i;
 char lpszCodeName_From[30], lpszCodeName_To[30];
 if (lpszCurCode)
  strcpy(lpszCodeName_From, lpszCurCode);
 else
  strcpy(lpszCodeName_From, "gb2312");
 if (lpszOutCode)
  strcpy(lpszCodeName_To, lpszOutCode);
 else
  strcpy(lpszCodeName_To, "UTF-16");
#ifdef _DEBUG
 fprintf(stdout, "Convert '%s' from %s to %s/n", lpszIn, lpszCodeName_From, lpszCodeName_To);
#endif
    //  if ((cd = iconv_open("unicode", "gb2312")) == (iconv_t)-1) {
    if ((cd = iconv_open(lpszCodeName_To, lpszCodeName_From)) == (iconv_t)-1) {
        perror("Couldn't open iconv");
        return false;
     }
     res = iconv(cd, &from_str, &from_sz, &to_str, &to_sz);
     if (res == -1) {
  perror("Couldn't use iconv");
  return false;
     }
     iconv_close(cd);

#endif
#ifdef _DEBUG
 fprintf(stdout, "Convert result: '%s'/n", lpszOut);
#endif
#endif      //  End of _WIN32

 return true;
}

int GB2312_AnsiToUnicode_Size(const char* lpszIn)
{
    int iCounter = 0;
 for (int index = 0; lpszIn[index]; index++) {
  if( (unsigned char)lpszIn[index] > 127 )
  {
   index++;
  }
  else
  {
            ;
  }
  iCounter+=2;
 }
    iCounter += 4;
#ifdef _DEBUG
    fprintf(stdout, "GB2312_AnsiToUnicode_Size() return %d/n", iCounter);
#endif
    return iCounter;
    //  return 48;

perl字符编码转化

gb2312转Utf8的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8", decode("gb2312",...
  • q383965374
  • q383965374
  • 2013年11月04日 21:44
  • 2178

Java字符编码的转化问题

我们通过二维码扫描来获得二维码中的信息。但是,我们的二维码的产生过程却是“多样化”的。即在产生二维码的时候是以不同的字符串编码类型进行编码的。比如,GBK、GB2312、UTF-8等等。而这些不同的编...
  • u013761665
  • u013761665
  • 2015年07月27日 10:27
  • 2237

Python学习笔记(二)字符编码转化

在上一篇我们提起倒编码,那么如何用Python进行字符转化了? 首先有两个函数:“ord( ) , chr( )”,其中ord( )是获取参数——字符整数表示(十进制),而chr( )与其相反,...
  • weixin_36541829
  • weixin_36541829
  • 2018年01月15日 23:27
  • 7

文本文件转换字符编码(UTF-8等)的通用方法

困扰我半年的问题居然是这种解决的办法www
  • u014599496
  • u014599496
  • 2017年07月18日 11:25
  • 417

浅谈C/C++编程中的字符编码转换

背景在写跨平台的C/C++代码过程中(本文的研究只限于C/C++范畴),经常会遇到中文字符串乱码的问题。比如,同一个源码,用MSVC编译/运行能正常显示中文字符串,但在linux下编译/运行显示中文字...
  • benkaoya
  • benkaoya
  • 2017年03月02日 15:11
  • 3862

中文字符编码的相互转换(一)

作为程序员,在日常的工作中总会遇到编码的知识。尤其是在前后台交互的过程中,字符编码如影随行。如果多个平台的字符编码不一致,需要相互转化的话,很有必要了解一下编码的工作原理。 网上有太多关于编码的知识...
  • yulongli
  • yulongli
  • 2014年04月03日 20:46
  • 6948

libiconv Qt中的各种字符编码转化

首先声明一下:可以用一个跨平台的库,网址:http://www.gnu.org/software/libiconv/  Qt中正是引用了这个库 iconv.h C:\Qt\Qt5.7.1\5.7\Sr...
  • ljt350740378
  • ljt350740378
  • 2017年08月10日 14:36
  • 148

C语言编码与字符转换

c语言支持的字符编码 多字节字符编码:用一个字节表示数字、字母,用多个字节表示其它字符(汉字两个字节)。字符长度定义:一个字节为一个字符长度。 宽字节字符编码(UNICODE):全部用两个字节表示...
  • rankun1
  • rankun1
  • 2016年03月03日 10:17
  • 3406

16进制编码与字符编码的相互转化

1、16进制编码转化为字符编码 #include "stdafx.h" #include using namespace std; int _tmain(int argc, _TCHAR* ar...
  • zhangtaohbwh
  • zhangtaohbwh
  • 2015年08月27日 20:07
  • 236

中文字符编码的相互转换(三)

Unicode,UTF-8,GBK编码之间的转换
  • yulongli
  • yulongli
  • 2014年04月05日 14:59
  • 2900
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符编码转化
举报原因:
原因补充:

(最多只允许输入30个字)