linux 宽字符串 转换_linux 字符型数组转换为字符串 - CSDN
  • 字符串:多字节与字节转换

    千次阅读 2016-11-23 15:42:25
    wcstombs 宽字符串转换为多字节字符串使用注意对于 mbstowcs 函数来说,它需要知道多字节的编码类型才能正确的将其转换成字节的 unicode,很可惜这个编码类型并没有体现在函数的参数列表里,而是隐含依赖全局的 ...

    C 标准

    #include <stdlib.h>
    mbstowcs 多字节字符串转换为宽字符串
    wcstombs 宽字符串转换为多字节字符串

    使用注意:
    对于 mbstowcs 函数来说,它需要知道多字节的编码类型才能正确的将其转换成宽字节的 unicode,很可惜这个编码类型并没有体现在函数的参数列表里,而是隐含依赖全局的 locale 。更加不幸的是,全局 locale 默认没有使用系统当前语言,而是设置为没什么用处的 “C” locale 。

    在调用 mbstowcs 之前,先用 setlocale 将全局默认 locale 设为当前系统默认 locale
    如果是在非中文系统上转 GBK 编码,就需要指定中文 locale :

    #include <locale.h>
    setlocale(LC_ALL, "chs");

    wcstombs例子:

    #include <locale.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define BUFFER_SIZE 100
    
    int main( void )
    {
        size_t  count;
        char    *pMBBuffer = (char *)malloc(BUFFER_SIZE);
        wchar_t *pWCBuffer = L"Hello, world.你好,世界。";
    
        setlocale(LC_ALL, "chs");
        count = wcstombs(NULL, pWCBuffer, 0); // 只获取多字节字符串的长度 
        count = wcstombs(pMBBuffer, pWCBuffer, BUFFER_SIZE); // 转换并返回多字节字符串的长度
        printf(" Characters converted: %u\n", count);
        printf(" Multibyte character: %s\n\n", pMBBuffer);
        free(pMBBuffer);
    }

    输出:

     Characters converted: 25
     Multibyte character: Hello, world.你好,世界。 

    mbstowcs例子

    #include <locale.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #define BUFFER_SIZE 100
    
    int main(void)
    {
        size_t  count;
        char    *pMBBuffer = "Hello, world.你好,世界。";
        wchar_t *pWCBuffer = (wchar_t *)malloc(BUFFER_SIZE);
    
        setlocale(LC_ALL, "chs");
        count = mbstowcs(NULL, pMBBuffer, 0);
        count = mbstowcs(pWCBuffer, pMBBuffer, strlen(pMBBuffer));
        printf(" Characters converted: %u\n", count);
        wprintf(L" Widebyte character: %s\n\n", pWCBuffer);
        free(pWCBuffer);
    }

    输出:

     Characters converted: 19
     Widebyte character: Hello, world.你好,世界。 

    Windows API

    #include <Windows.h>
    MultiByteToWideChar 多字节转宽字节,并且支持字符编码相互转换(gbk–utf8)
    WideCharToMultiByte 宽字节转多字节,并且支持字符编码相互转换(gbk–utf8)

    WideCharToMultiByte例子:

    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>
    
    #define BUFFER_SIZE 100
    
    int main( void )
    {
        size_t  count;
        char    *pMBBuffer = (char *)malloc(BUFFER_SIZE);
        wchar_t *pWCBuffer = L"Hello, world.你好,世界。";
    
        count = WideCharToMultiByte(0, 0, pWCBuffer, wcslen(pWCBuffer)+1, pMBBuffer, BUFFER_SIZE, NULL, NULL); 
    
        printf(" Characters converted: %u\n",count );
        printf(" Multibyte character: %s\n\n",pMBBuffer );
        free(pMBBuffer);
    }

    结果:

     Characters converted: 26
     Multibyte character: Hello, world.你好,世界。 

    MultiByteToWideChar例子:

    #include <locale.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>
    
    #define BUFFER_SIZE 100
    
    int main(void)
    {
        size_t  count;
        char    *pMBBuffer = "Hello, world.你好,世界。";
        wchar_t *pWCBuffer = (wchar_t *)malloc(BUFFER_SIZE);
    
        count = MultiByteToWideChar(0, 0, pMBBuffer, strlen(pMBBuffer)+1, pWCBuffer, BUFFER_SIZE);
    
        setlocale(LC_ALL, "chs"); // 设置wprintf正常显示中文
        printf(" Characters converted: %u\n", count);
        wprintf(L" Widebyte character: %s\n\n", pWCBuffer);
        free(pWCBuffer);
    }

    结果:

     Characters converted: 20
     Widebyte character: Hello, world.你好,世界。 
    展开全文
  • //把字符串转换字符串 02 wstring string2Wstring(string sToMatch) 03 {  04 #ifdef _A_WIN 05  int iWLen = Mul
    //把字符串转换成宽字符串
    02
    wstring string2Wstring(string sToMatch)
    03
    {  
    04
    #ifdef _A_WIN
    05
        intiWLen = MultiByteToWideChar( CP_ACP, 0, sToMatch.c_str(), sToMatch.size(), 0, 0 );// 计算转换后宽字符串的长度。(不包含字符串结束符)
    06
        wchar_t*lpwsz = newwchar_t [iWLen + 1];
    07
        MultiByteToWideChar( CP_ACP, 0, sToMatch.c_str(), sToMatch.size(), lpwsz, iWLen ); // 正式转换。
    08
        lpwsz[iWLen] = L'/0';
    09
        wstring wsToMatch(lpwsz);
    10
        delete[]lpwsz;
    11
    #elif _A_LINUX
    12
        setlocale( LC_CTYPE, ""); // 很重要,没有这一句,转换会失败。
    13
        intiWLen = mbstowcs( NULL, sToMatch.c_str(), sToMatch.length() ); // 计算转换后宽字符串的长度。(不包含字符串结束符)
    14
        wchar_t*lpwsz = newwchar_t[iWLen + 1];
    15
        inti = mbstowcs( lpwsz, sToMatch.c_str(), sToMatch.length() ); // 转换。(转换后的字符串有结束符)
    16
        wstring wsToMatch(lpwsz);
    17
        delete[]lpwsz;
    18
    #endif
    19
        returnwsToMatch;
    20
    }
    21
    //把宽字符串转换成字符串,输出使用
    22
    string wstring2string(wstring sToMatch)
    23
    {  
    24
    #ifdef _A_WIN
    25
        string sResult;
    26
        intiLen = WideCharToMultiByte( CP_ACP, NULL, sToMatch.c_str(), -1, NULL, 0, NULL, FALSE );// 计算转换后字符串的长度。(包含字符串结束符)
    27
        char*lpsz = newchar[iLen];
    28
        WideCharToMultiByte( CP_OEMCP, NULL, sToMatch.c_str(), -1, lpsz, iLen, NULL, FALSE); // 正式转换。
    29
        sResult.assign( lpsz, iLen - 1 ); // 对string对象进行赋值。
    30
        delete[]lpsz;
    31
    #elif _A_LINUX
    32
        intiLen = wcstombs( NULL, sToMatch.c_str(), 0 ); // 计算转换后字符串的长度。(不包含字符串结束符)
    33
        char*lpsz = newchar[iLen + 1];
    34
        inti = wcstombs( lpsz, sToMatch.c_str(), iLen ); // 转换。(没有结束符)
    35
        lpsz[iLen] = '/0';
    36
        string sResult(lpsz);
    37
        delete[]lpsz;
    38
    #endif
    39
        returnsResult;
    40
    }
    
    

    转自:http://bbs.unix8.net/thread-233-1-1.html
       
    展开全文
  • linux字节和多字符之间的转换

    千次阅读 2018-01-23 20:01:58
    本文介绍两个由C语言提供的宽字符(wchar_t类型)和多字节字符( 一个字符用一个或者多个字节表示) 转换函数,因此具有通用性(在Windows/Linux系统中都可以使用): 所需头文件:stdlib.h #include size_t ...

    本文介绍两个由C语言提供的宽字符(wchar_t类型)和多字节字符( 一个字符用一个或者多个字节表示) 转换函数,因此具有通用性(在Windows/Linux系统中都可以使用):
    所需头文件:stdlib.h
    #include

    size_t mbstowcs(
       wchar_t *wcstr,
       const char *mbstr,
       size_t count 
    );

    参数:
    1> wcstr 目标缓存,用来存放转换之后的宽字节字符;当取值为NULL时,返回值为目标缓存所需wchar_t类型的个数
    2> mbstr 用来存放待转换的多字节字符串
    3> count 用来指定最多转换多少Byte。当wcstr取值为NULL时,该值无用
    返回值:
    转换成功,且wcstr == NULL时,返回目标缓存所需的大小(wchar_t 类型个数,但不含终结符);
    转换成功,且wcstr != NULL时,返回转换的字节数;
    转换不成功,返回(size_t) (-1);
    使用步骤:
    1) 调用mbstowcs()函数,设置参数 wcstr 为NULL(用以获取转换所需的接收缓冲区大小);
    2) 给目标缓存区分配足够的内存块,用于存放转换后的wchar_t字符串;
    注意:该内存块的大小由首次调用mbstowcs()函数的返回值来决定(该返回值不包含终止符的空间)
    3) 再次调用mbstowcs()函数,这次将目标缓存的地址作为 wcstr 参数来传递;
    代码示例:

    strcpy(sBuf, "我最棒");  
    size_t sSize=strlen(sBuf);  
    
    wchar_t * dBuf=NULL;  
    
    <span style="color:#ff0000;">//注意:需要多分配一个空间,以存放终止符</span>  
    int dSize=mbstowcs(dBuf, sBuf, 0)+1;  
    
    dBuf=new wchar_t[dSize];  
    wmemset(dBuf, 0, dSize);  
    
    int nRet=mbstowcs(dBuf, sBuf, sSize);  
    if(nRet<=0)  
    {  
        printf("转换失败\n");  
    }  
    else  
    {  
        printf("转换成功%d字符\n", nRet);  
        wprintf(L"%ls\n", dBuf);  
    }  

    ( 2 ) wcstombs()
    功能:
    把宽字符把转换成多字节字符串
    原型:

    size_t wcstombs(
       char *mbstr,
       const wchar_t *wcstr,
       size_t count 
    );

    参数:
    1> wcstr 目标缓存,用来存放转换之后的多字节字符;当取值为NULL时,返回值为目标缓存所需wchar_t类型的个数;
    2> mbstr 用来存放待转换的宽字符;
    3> count 用来指定接收缓存里能够存储的最大的字节数;
    返回值:
    转换成功,且mbstr == NULL时,返回目标缓存所需的大小(char 类型个数,但不含终结符);
    转换成功,且mbstr != NULL时,返回转换的字节数;
    转换不成功,返回(size_t)(-1);
    注意:
    If wcstombs encounters a wide character it cannot be convert to a multibyte character, it returns –1 cast to type size_t.
    使用方法:
    与mbstowcs()方法类似
    示例代码:

    wchar_t sBuf[20]={0};  
    wcscpy(sBuf, L"Hello");  
    size_t sSize=wcslen(sBuf);  
    
    
    char * dBuf=NULL;  
    
    
    int dSize=wcstombs(dBuf, sBuf, 0)+1;  
    printf("需要%d Char\n", dSize);  
    
    dBuf=new char[dSize];  
    memset(dBuf, 0, dSize);  
    
    
    int nRet=wcstombs(dBuf, sBuf, dSize);  
    
    if(nRet<=0)  
    {  
        printf("转换失败\n");  
    }  
    else  
    {  
        printf("转换成功%d字符\n", nRet);  
        printf("%s\n", dBuf);  
    }  

    上面的代码在转换英文的时候没有问题,在转换中文时,wcstombs()函数会返回-1
    注意:
    宽字节,即wchar_t 类型采用Unicode编码方式,在Windows中为utf-16,在Linux中为utf-32
    而多字节则可能是其他很多编码方式,如utf-8、GB232….
    因此,需要指定多字节编码类型,才能进行正常的转换过程。
    设置或获取多字节编码方式用函数:setlocale()
    所需头文件:locale.h
    #include

    展开全文
  • 最近再调linux下证书验证问题,由于要对客户端发送过来的证书在服务器上与根证书进行认证,所以在读取证书、验证证书时设计到了编码转换问题。在windows下,使用MultiByteToWideChar和WideCharToMultiByte没有问题,...

    最近再调linux下证书验证问题,由于要对客户端发送过来的证书在服务器上与根证书进行认证,所以在读取证书、验证证书时设计到了编码转换问题。在windows下,使用MultiByteToWideChar和WideCharToMultiByte没有问题,但在linux下,不存在这两个函数,于是我们想到了用wcstombs和mbstowcs两个函数,但经试验,不能得到正确的结果,后来,经分析,得到,在windows下wchar_t为2字节,而在linux wchar_t为4字节,我们提取的证书编码为2字节的宽字符,所以不能正确地进行转换。不得不,只能使用libiconv进行转换。

    iconv函数族的头文件是iconv.h。
    #include <iconv.h>
    iconv函数族有三个函数,原型如下:
    (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、宽字节存在big-endian和little-endian之分,那使用宽字符编码时使用的编码名字也不一样,例如我们用的UCS-2编码,那有“UCS-2”和“UCS-2-INTERNAL”之分;

    2、iconv中的两个长度在运行完函数后,分别为分配缓存剩余字节的大小;

    3、而两个指针分别指向转换后字符串的尾部,所以在进行转换之前,应该保留缓存的原始指针,在转换后,用这两个指针减去原始指针,那就是已转换的字节长度和转换后的字节长度。

    下面是我测试的代码,程序写的不怎么考究,呵呵!

     

    #include <iconv.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <locale.h>
     
    #define BUFLEN 200
    char outBuf[BUFLEN];
    //char inBuf[BUFLEN]="CN";
    char inBuf[BUFLEN]="/x43/x00/x4e/x00/x00/x00";
    //char inBuf[BUFLEN]="/x7a/x7a/x51/x9b/x00/x00";
     
    int main(){
     
            char *pIn = inBuf;
            char *pOut = outBuf;
            iconv_t cd;
            int inLen = 4, outLen = BUFLEN;
            int retSize = 0;
     
            cd = iconv_open("UTF-8","UCS-2-INTERNAL");
    //      cd = iconv_open("UCS-2-INTERNAL","UTF-8");
            if ((iconv_t)-1 == cd){
                    printf("Donot support this convert../n");
                    return -1;
            }
            if ((size_t)-1 == (retSize= iconv(cd, &pIn, (size_t *)&inLen, &pOut,(size_t *)&outLen))){
                    if (E2BIG == errno)
                            printf(" E2BIG errno %d/n", errno);
                    if (EILSEQ == errno)
                            printf("EILSEQ errno %d/n", errno);
                    if (EINVAL == errno)
                            printf("EINVAL errno %d/n", errno);
                    printf("convert WCHAR to multi error/n");
                    return -1;
            }
     
            if (outLen > 0){
     
                    printf("/n/n outBuf:");
                    int i = 0;
                    for (i = 0; i < 200; i++){
                            printf("%02x ", outBuf[i]);
                    }
                    printf("/n/n inBuf:");
                    for (i = 0; i < 200; i++){
                            printf("%02x ", inBuf[i]);
                    }
                    printf("/n/n");
            }
            printf("out buf: %s outLen: %d retSize: %d inLen: %d/n", pOut, outLen, retSize, inLen);
            printf("pInbuf: %s/n", pIn);
            iconv_close(cd);
            return 0;
    }

     

     

    展开全文
  • C++宽字符串字符串

    千次阅读 2015-07-25 14:38:29
    这文章是更改别人代码 把字符串转换字符串 字符串转字符串
  • Linux字符串转换成命令执行Linux sh脚本中怎样将字符串转化为命令答案:在shell脚本中使用eval命令(此命令是bash的内置命令,凡是bash的内置命令查看帮助时用man eval),而不是exec。语法:eval 参数参数可以...
  • Linux字符串转整形数字的函数

    千次阅读 2017-05-12 16:04:16
    Linux内核中提供的一些字符串转换函数: lib/vsprintf.c 1. unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base) 2. unsigned long simple_strtoul(const char *cp, ...
  • Linux内核中提供的一些字符串转换函数: lib/vsprintf.c unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base) unsigned long simple_strtoul(const char *cp, char **endp, ...
  • Linux shell 字符串操作

    2019-04-10 21:47:37
    shell脚本中对字符串的处理 1 ${#变量名} 作用:返回字符串的长度 # foo="this is a test" # echo ${#foo} //返回字符串的长度 14 2 ${变量名:offset:length} 作用:截取字符串,length指定截取的长度,也...
  • 我们在shell 脚本编程中,经常需要用到字符串切割,即将字符串切割为一个数组,类似java 中的split 函数,下面对几种常见的方式做一个总结。目录方法一: 利用shell 中 变量 的字符串替换 方法二: 设置分隔符,...
  • 1.字符串转换为整数  atoi()函数,原型int atoi(const char *nptr),包含在头文件stdlib.h中,用法如:char *a="123";int n=atoi(a);printf("%d",n); 2.整数转换为字符串  Linux中没有itoa()可用,但是用...
  • 1,字符串转整型(一)#include <stdlib.h>int atoi(const char *nptr);字符串转化为整型long atol(const char *nptr);字符串转化为长整型long long atoll(const char *nptr);long long atoq(const char *nptr...
  • Linux内核中提供的一些字符串转换函数: lib/vsprintf.c [html] view plaincopyprint?  1. unsigned long long simple_strtoull(const char *cp, char **endp, unsigned...
  • linux字符串与十六进制之间的转换

    万次阅读 2015-09-10 09:47:53
    #include ...//字符串转换成16进制 inline char *CharArrayToHexString(char* pOut, const int nMaxLen, const char* pInput, const int nInLen) { const char* chHexList = "0123456789ABCDEF";
  • 有一需求是根据输入的字符串转换成时间,并根据输入的这个字符串求得n天前 n天后等时间 time='20150902' startSec=`date -d "$time 1 week ago" +%Y%m%d`  echo $startSec
  • linux shell 字符串转数字

    千次阅读 2017-10-28 21:58:23
    Linux shell 字符串转数字 运算 $(())
  • Linux 使用指定字符串分割字符串

    千次阅读 2018-11-23 18:14:53
    Linux 使用指定字符串分割字符串【待完善】 Shell脚本中,我们经常需要使用指定字符串分割某字符串。比如在字符串hadooparegood,sparkarebetter,andhbase areexcellent中,需要使用字符串 is 替换 are。那么该怎么...
  • Ascll字符串转换到二进制字符串

    千次阅读 2017-03-27 23:40:38
    上一章说到二进制字符串转换到Ascll字符串的方法,本章按照同样的原理来说下Ascll字符串转换到二进制字符串的方法。函数定义如下:int AscllToBinary(char* dst,const void* src,int low,int len);代码实现如下://...
  • linux 字符串转换成数组

    千次阅读 2014-02-17 11:21:50
    linux中数组用小括号定义,所以转换的时候只需要吧变量放在小括号中即可 1. 直接创建数组 [root@hadoop ~]# names=(wei hong rao) [root@hadoop ~]# echo ${#names[@]} 3 2.通过命令结果获取数组 [root@...
  • 字符串转换为整数

    千次阅读 2017-05-14 21:02:03
    第三十章、字符串转换成整数  先看题目:  输入一个表示整数的字符串,把该字符串转换成整数并输出,例如输入字符串"345",则输出整数345。 给定函数原型int StrToInt(const char *str) ,完成函数StrToInt,...
1 2 3 4 5 ... 20
收藏数 183,426
精华内容 73,370
关键字:

linux 宽字符串 转换