Linux下 wchar_t 與char 轉換

爲了支持多語言,須要支持寬字符,Linux下用wchar_t表示,wchar_t最大長度4個字節,已經能夠囊括世界上全部的語言編碼,中文字符在gb2312編碼下用2個字節表示,但用utf-8編碼須要3個字節表示。函數

Linux下的系統調用,大部分都已經有對應的寬字符版本。具體可參照對照表測試

但仍有一些系統調用是沒有寬字符版本的,例如fopen系列函數:編碼

FILE *fopen(const char *path, const char *mode);.net

首先要設置本地區域blog

setlocale(LC_CTYPE, "zh_CN.utf8");
1
而後進行轉換utf-8

/**
 * 用malloc申請了空間,須要在外面釋放
 */
int to_wchar(wchar_t **ppDest, const char *pSrc)
{
    int len = 0;
    int ret = 0;字符串

    len = strlen(pSrc) + 1;get

    if (len <= 1) return 0;string

    *ppDest = malloc (len);io

    /*這裏的len應該爲寬字符長度,而非源字符串的字節長度,但字節長度確定大於寬字符長度,所以暫且用之*/
    ret = mbstowcs(*ppDest, pSrc, len);

    return ret;
}
/**
 * 用malloc申請了空間,須要在外面釋放
 */
int wtochar(char **ppDest, const wchar_t *pSrc)
{
    int len = 0;
    int ret = 0;

    len = wcslen(pSrc) + 1;

    if (len <= 1) return 0;

    /*sizeof(wchar_t) = 4 */
    *ppDest = malloc (len * sizeof(wchar_t));

    /*這裏的第三個長度參數,應爲字節長度,即寬字符長度 * 4 */
    ret = wcstombs(*ppDest, pSrc, len * sizeof(wchar_t));

    return ret;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
測試程序:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <wchar.h>
#include <locale.h>
#define array_size(ar) (sizeof(ar) / sizeof(ar[0]))

wchar_t *to_wchar(wchar_t **ppDest, const char *pSrc)
{

    int len = 0;
    int ret = 0;

    len = strlen(pSrc) + 1;

    if (len <= 1) return *ppDest;

    *ppDest = (wchar_t*)malloc (len*sizeof(wchar_t));

    /*若是第一個參數爲NULL,則能夠用來返回寬字符的長度*/
    printf ("len:%ld\n", mbstowcs(NULL,pSrc,0)+1);

    ret = mbstowcs(*ppDest, pSrc, len);

    return *ppDest;
}
int main()
{
    char *a = "一";
    wchar_t *b = L"1s一";
    wchar_t *c = L"1s一";
    wchar_t *pbuf;
    wchar_t wbuf[100];

    setlocale(LC_CTYPE, "zh_CN.utf8");

    printf ("len:%ld\n", strlen(a));
    printf ("wlen:%ld\n", wcslen(b));

    to_wchar(&pbuf, "1s壹");

    free(pbuf);

    printf ("wbuf sieof:%ld\n", sizeof(wbuf));
    printf ("wbuf array sizeof:%ld\n", array_size(wbuf));

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
輸出結果:

[root@23 test]# ./test_hanzi  len:3  wlen:3  len:4  wbuf sieof:400 // sizeof (寬字符) = 所佔字節的總長度 = 寬字符長度 * 4  wbuf array sizeof:100 ---------------------  做者:wwlhz  來源:CSDN  原文:https://blog.csdn.net/wwlhz/article/details/74775053  版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索