1. 程式人生 > >Linux下 wchar_t 與char 轉換

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);

首先要設定本地區域

setlocale(LC_CTYPE, "zh_CN.utf8");

然後進行轉換

/**
 * 用malloc申請了空間,需要在外面釋放
 */
int to_wchar(wchar_t **ppDest, const char *pSrc) { int len = 0; int ret = 0; len = strlen(pSrc) + 1; if (len <= 1) return 0; *ppDest = malloc (len); /*這裡的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; }

測試程式:

#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;
}

輸出結果:

[[email protected] test]# ./test_hanzi
len:3
wlen:3
len:4
wbuf sieof:400 // sizeof (寬字元) = 所佔位元組的總長度 = 寬字元長度 * 4
wbuf array sizeof:100

相關推薦

Linux wchar_t char 轉換

為了支援多語言,需要支援寬字元,Linux下用wchar_t表示,wchar_t最大長度4個位元組,已經可以囊括世界上所有的語言編碼,中文字元在gb2312編碼下用2個位元組表示,但用utf-8編碼需要3個位元組表示。 Linux下的系統呼叫,大部分都已經有對

Linuxjstringchar字串型別之間的轉換

2011-1-24 Kagula 內容簡介 以原始碼的形式介紹Linux下JNI程式設計中如何在jstring同char *型別之間轉換。 本文的原始碼基本來自網上,這裡只是做了很小的修改。 正文      待呼叫的兩個函式的原始碼 char* jstringToNative

C++多位元組寬位元組間的轉換(wchar_tchar轉換)

轉載:https://www.cnblogs.com/zhwl/archive/2012/11/23/2784282.html C++多位元組與寬位元組間的轉換(wchar_t與char轉換) 最近在C++程式設計中經常遇到需要多位元組字元與寬位元組字元相互轉換的問題,一直自己貼那幾句程

【MFC】Unicode環境CStringchar*轉換

CString轉const char* const char* CStr2C(CString cstring) { return CW2A(cstring.GetString()); } char*轉CString CString C2CStr(char* cstr) { ret

Unicode字符集CStringchar *轉換

在Visual C++.NET2005中,預設的字符集形式是Unicode,但在VC6.0等工程中,預設的字符集形式是多位元組字符集(MBCS:Multi-Byte Character Set),這樣導致在VC6.0中非常簡單實用的各類字元操作和函式在VS2005環境下執行

Unicode字符集CStringchar *轉換 (解決中文亂碼等)(轉)

1、Unicode下CString轉換為char * 方法一:使用API:WideCharToMultiByte進行轉換              CStringstr = _T("D:\\校內專案\\QQ.bmp");             //注意:以下n和l

Unicode的CStringchar *轉換

轉載:http://blog.sina.com.cn/s/blog_63106cd80100yq8n.html 在VS2005及以上的環境中,所見工程的預設字符集形式是Unicode,而VC6.0中,字符集形式為多位元組字符集(MBCS: Multi-Byte Character Set),

UnicodeCStringchar *之間的轉換

1、Unicode下CString轉換為char * 方法一:使用API:WideCharToMultiByte進行轉換        CStringstr = _T("D:\\校內專案\\QQ.bmp");        //注意:以下n和len的值大小不同,n是按字元計

linux字串十六進位制之間的轉換

#include <stdio.h> #include <unistd.h> #include <string.h> //字串轉換成16進位制 inline char *CharArrayToHexString(char* pOut,

關於wchar_t 的輸出及 wchar_t* char*之間的相互轉換

wchar_t 定義的變數之所以不能輸出呢?我查了一下資料,就是說寬字元型別要本地化,否則輸不出想要結果。 本地化有三條語句可以使用,任取其一。最後一句是全域性函式,前兩個是wcout的一個成員函式的兩種表達方式。 std::wcout.imbue(std::locale(

Unicode字符集CString/tchar*char *轉換 (解決中文亂碼等)

Unicode環境下寬字元------->窄字元的轉換 定義:TCHAR m_szIp[MAX_IP_LEN];   我們要將TCHANR型別陣列(寬字元型)轉換為char*pBuffer型別(

linuxpdftxt互相轉換方法

在linux下,我們如果想用vim編輯pdf檔案,則必須先將pdf檔案轉換成txt檔案才能用vim開啟。 linux下,可以使用pdftotext  filename.pdf將相應的pdf檔案轉換成同名txt檔案。 然後就可以用vim開啟進行編輯。 然後可以利用qt中的庫

Intellij idea史上最簡單的教程之Linux安裝破解Intellij idea2017

成功 zxvf java 新建 pre form 旗艦版 lan intel 一、前言 這一節我們介紹在Linux下如何安裝與破解Intellij idea2017。現在有很多公司開發環境都是Linux,所以掌握在Linux環境下使用Idea辦公也是咱們必須得掌握的技能。

Linux安裝配置Nginx

下載 訪問 準備 cep ssi config configure 你會 inpu 一、準備 Nginx版本:nginx-1.7.7.tar.gz 請自行到官網下載對應的版本。 二、步驟 ?在Linux新建一個queenLove用戶 [[email prot

linux打包壓縮

包名 大小 方便 文件 nbsp 視頻 查看 more 文本文 歸檔   文檔很多,很亂, 方便使用、查閱、閱讀 已於管理(批量刪除文件) 壓縮 a.txt /etc/passwd 文本文件壓縮後很省空間 aaa.jpeg 壓縮

linuxlastlastb命令詳解

bubuko 使用 文件的 clas ip地址 tty 遠程 默認 讀取 在linux系統中,last與lastb命令用來列出目前與過去登錄系統的用戶相關信息。指令英文原義: last, lastb - show listing of last logged in user

linux目錄文件的查找

crypt only map 是個 工作 roo splay strong 過程 參考網址:http://www.runoob.com/linux/linux-command-manual.html which命令: which命令用於查找並顯示給定命令的絕對路徑,環境

Linuxlscp命令

col src 註意 nbsp 技術 span 分享 應用 bubuko     Linux熟練的應用命令,才可以隨心所欲~ ls 註意:   ls -1 //每次只列出1個文件 cp 註意:   cp -u xxx xxx //註意修改時間的先

linux安裝配置Redis

修改 密碼 ted 路徑 設置密碼 fix 安裝與配置 安裝 bsp 1.安裝 (1)獲取源代碼   wget http://download.redis.io/releases/redis-4.0.8.tar.gz (2)解壓   tar xzvf redis-4.0.8

LinuxApachetomcat的整合

一.jdk安裝 1.在www.sun.com中下載linu的jdk1.6,下載到/home/lijing/下 2.在當前目錄下,輸入sh jdk-6u2-linux-i586-rpm.bin   看到 安裝程式在詢問您是否尊守許可協議頁面 ,回車,空格都可以,看完協議. &