字符编码转化

原创 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;

字符編碼轉化V1.1

  • 2010年11月17日 17:43
  • 15KB
  • 下载

字符编码转化V1.0.iso

  • 2010年09月29日 16:13
  • 14KB
  • 下载

Java字符编码的转化问题

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

字符编码简介:ASCII,Unicode,UTF-8,GB2312及Unicode和UTF-8如何转化

参考: http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html http://www.cnblogs.com/mjg...

谈谈c#中的字符编码转化 (sqlite 中文路径的问题)

谈到这个问题,完全是因为使用sqilte 时,不支持中文路径。准确来讲不是不支持,二是只支持以UTF8编码格式的中文路径。相信很多朋友都碰到过这个问题。 google,百度一搜,全是这样的解决方案:...
  • ikok
  • ikok
  • 2012年09月28日 16:31
  • 4909

字符编码查看器 1.4.2

  • 2017年11月10日 15:24
  • 37KB
  • 下载

字符编码转换工具

  • 2017年07月12日 09:17
  • 349KB
  • 下载

C/C++ 各种字符编码字符串的转换 可用于XML文件的字符转化读写 (收集 GBK - UTF8 - Unicode - ANSI )

下文中的所有代码,主要涉及两个中的函数MultiByteToWideChar、WideCharToMultiByte,所以在使用的时候注意#include -----------GBK - UTF...

中英文字符编码查询_V1.1.rar

  • 2015年06月13日 18:47
  • 15KB
  • 下载

字符编码文档

  • 2015年05月26日 15:06
  • 379KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符编码转化
举报原因:
原因补充:

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