你說的好像是不對。這是把ascii馬用16進制表示。并不是utf8,我不知道你要干什么,不過我猜你做的是web應(yīng)用,需要把特殊字符轉(zhuǎn)化成%16進制格式,如果你的系統(tǒng)真是utf8的話,我想你應(yīng)該這么做
成都創(chuàng)新互聯(lián)公司2013年成立,公司自成立以來始終致力于為企業(yè)提供官網(wǎng)建設(shè)、移動互聯(lián)網(wǎng)業(yè)務(wù)開發(fā)(小程序制作、手機網(wǎng)站建設(shè)、成都app軟件開發(fā)公司等),并且包含互聯(lián)網(wǎng)基礎(chǔ)服務(wù)(域名、主機服務(wù)、企業(yè)郵箱、網(wǎng)絡(luò)營銷等)應(yīng)用服務(wù);以先進完善的建站體系及不斷開拓創(chuàng)新的精神理念,幫助企業(yè)客戶實現(xiàn)互聯(lián)網(wǎng)業(yè)務(wù),嚴格把控項目進度與質(zhì)量監(jiān)控加上過硬的技術(shù)實力獲得客戶的一致贊譽。
用iconv_open和iconv,先把字符串變成utf-8。然后在把這個串中的每個字節(jié)都變成16進制加%的格式。
如果你只是需要16進制轉(zhuǎn)換,那就簡單了。把沒有字符的ascii拿出來,sprintf(%02x)成16進制,在合起來就成。
#includestdio.h?
#includewindows.h?
void?GetUtf8(unsigned?short?uni)??
{??
unsigned?char?utf_8[3];??
utf_8[0]=(0xe4)?|?((uni??0xf000)12);//相當于把二進制1110右移12位??
utf_8[1]=(0x26)?|?((uni??0x0fc0)6);?//相當于把二進制10右移16位??
utf_8[2]=(0x26)?|?(uni??0x003f);??????//相當于取二進制低6位??
printf("UTF-8編碼的第一個字節(jié)為0x%.2x\n",utf_8[0]);??
printf("UTF-8編碼的第一個字節(jié)為0x%.2x\n",utf_8[1]);??
printf("UTF-8編碼的第一個字節(jié)為0x%.2x\n",utf_8[2]);??
}??
void?main()??
{??
char?a[3];
wchar_t?str;
printf("輸入一個漢字:\n");
gets(a);
MultiByteToWideChar(CP_ACP,?0,?a,?-1,?str,?1);
printf("%s",?a);
printf("字Unicode編碼為%x\n",(unsigned?short)str);??
GetUtf8((unsigned?short)str);
}
普通sting類型 轉(zhuǎn)UTF-8編碼格式字符串std::string ofDewarServer::string_To_UTF8(const std::string str)
{
int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然會出現(xiàn)尾巴
ZeroMemory(pwBuf, nwLen * 2 + 2);
::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);
int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);
char * pBuf = new char[nLen + 1];
ZeroMemory(pBuf, nLen + 1);
::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);
std::string retStr(pBuf);
delete []pwBuf;
delete []pBuf;
pwBuf = NULL;
pBuf = NULL;
return retStr;
}
其實 linux 和 windows 的系統(tǒng)函數(shù)都是C函數(shù),并且提供了GB2312toUTF-8的函數(shù),所以C語言是可以實現(xiàn)轉(zhuǎn)碼的。以下是windows的例子:int num = ::MultiByteToWideChar(CP_ACP, 0, "你好", -1, NULL, 0);wchar_t* m_arrayShort = new wchar_t[num];::MultiByteToWideChar(CP_ACP, 0, "你好", -1, m_arrayShort, num); int len = ::WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)m_arrayShort, num, 0, 0, NULL, NULL);char *tmpPT = new char[len+1];::WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)m_arrayShort, num, tmpPT, len, NULL, NULL);tmpPT[len] = 0;
哎呀。都是干嘛的???很簡單的啊。
你用二進制的方式寫文件,不就行了啊。
寫文件的時候,把要寫入的數(shù)據(jù),用一個函數(shù)轉(zhuǎn)換程utf8編碼的數(shù)據(jù),就ok了啊
雖然我沒在linux下編過,但每個系統(tǒng),每個開發(fā)環(huán)境,肯定提供了
編碼轉(zhuǎn)換的函數(shù)庫
的啊