日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ansi、Unicode、UTF8字符串之间的转换和写入文本文件

發布時間:2023/12/9 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ansi、Unicode、UTF8字符串之间的转换和写入文本文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請注明出處http://www.cppblog.com/greatws/archive/2008/08/31/60546.html

最近有人問我關于這個的問題,就此寫一篇blog

Ansi字符串我們最熟悉,英文占一個字節,漢字2個字節,以一個\0結尾,常用于txt文本文件
Unicode字符串,每個字符(漢字、英文字母)都占2個字節,以2個連續的\0結尾,NT操作系統內核用的是這種字符串,常被定義為typedef unsigned short wchar_t;所以我們有時常會見到什么char*無法轉換為unsigned short*之類的錯誤,其實就是unicode
UTF8是Unicode一種壓縮形式,英文A在unicode中表示為0x0041,老外覺得這種存儲方式太浪費,因為浪費了50%的空間,于是就把英文壓縮成1個字節,成了utf8編碼,但是漢字在utf8中占3個字節,顯然用做中文不如ansi合算,這就是中國的網頁用作ansi編碼而老外的網頁常用utf8的原因。
UTF8在還游戲里運用的很廣泛,比如WOW的lua腳本等

下面來說一下轉換,主要用代碼來說明吧
寫文件我用了CFile類,其實用FILE*之類的也是一樣,寫文件和字符串什么類別沒有關系,硬件只關心數據和長度

Ansi轉Unicode
介紹2種方法


void?CConvertDlg::OnBnClickedButtonAnsiToUnicode()
{
????
//?ansi?to?unicode
????char*?szAnsi?=?"abcd1234你我他";
????
//預轉換,得到所需空間的大小
????int?wcsLen?=?::MultiByteToWideChar(CP_ACP,?NULL,?szAnsi,?strlen(szAnsi),?NULL,?0);
????
//分配空間要給'\0'留個空間,MultiByteToWideChar不會給'\0'空間
????wchar_t*?wszString?=?new?wchar_t[wcsLen?+?1];
????
//轉換
????::MultiByteToWideChar(CP_ACP,?NULL,?szAnsi,?strlen(szAnsi),?wszString,?wcsLen);
????
//最后加上'\0'
????wszString[wcsLen]?=?'\0';
????
//unicode版的MessageBox?API
????::MessageBoxW(GetSafeHwnd(),?wszString,?wszString,?MB_OK);

????
//接下來寫入文本
????
//寫文本文件,頭2個字節0xfeff,低位0xff寫在前
????CFile?cFile;
????cFile.Open(_T(
"1.txt"),?CFile::modeWrite?|?CFile::modeCreate);
????
//文件開頭
????cFile.SeekToBegin();
????cFile.Write(
"\xff\xfe",?2);
????
//寫入內容
????cFile.Write(wszString,?wcsLen?*?sizeof(wchar_t));
????cFile.Flush();
????cFile.Close();
????delete[]?wszString;
????wszString?
=NULL;


????
//方法2
????
//設置當前地域信息,不設置的話,使用這種方法,中文不會正確顯示
????
//需要#include<locale.h>
????setlocale(LC_CTYPE,?"chs");?
????wchar_t?wcsStr[
100];
????
//注意下面是大寫S,在unicode中,代表后面是ansi字符串
????
//swprintf是sprintf的unicode版本
????
//格式的前面要加大寫L,代表是unicode
????swprintf(wcsStr,?L"%S",?szAnsi);
????::MessageBoxW(GetSafeHwnd(),?wcsStr,?wcsStr,?MB_OK);

}


Unicode轉Ansi
也是2種方法

void?CConvertDlg::OnBnClickedButtonUnicodeToAnsi()
{
????
//?unicode?to?ansi
????wchar_t*?wszString?=?L"abcd1234你我他";
????
//預轉換,得到所需空間的大小,這次用的函數和上面名字相反
????int?ansiLen?=?::WideCharToMultiByte(CP_ACP,?NULL,?wszString,?wcslen(wszString),?NULL,?0,?NULL,?NULL);
????
//同上,分配空間要給'\0'留個空間
????char*?szAnsi?=?new?char[ansiLen?+?1];
????
//轉換
????
//unicode版對應的strlen是wcslen
????::WideCharToMultiByte(CP_ACP,?NULL,?wszString,?wcslen(wszString),?szAnsi,?ansiLen,?NULL,?NULL);
????
//最后加上'\0'
????szAnsi[ansiLen]?=?'\0';
????
//Ansi版的MessageBox?API
????::MessageBoxA(GetSafeHwnd(),?szAnsi,?szAnsi,?MB_OK);

????
//接下來寫入文本
????
//寫文本文件,ANSI文件沒有BOM
????CFile?cFile;
????cFile.Open(_T(
"1.txt"),?CFile::modeWrite?|?CFile::modeCreate);
????
//文件開頭
????cFile.SeekToBegin();
????
//寫入內容
????cFile.Write(szAnsi,?ansiLen?*?sizeof(char));
????cFile.Flush();
????cFile.Close();
????delete[]?szAnsi;
????szAnsi?
=NULL;


????
//方法2
????
//和上面一樣有另一種方法
????setlocale(LC_CTYPE,?"chs");?
????
char?szStr[100];
????
//注意下面是大寫,在ansi中,代表后面是unicode字符串
????
//sprintf
????sprintf(szStr,?"%S",?wszString);
????::MessageBoxA(GetSafeHwnd(),?szStr,?szStr,?MB_OK);
}


Unicode轉UTF8

void?CConvertDlg::OnBnClickedButtonUnicodeToU8()
{
????
//?unicode?to?UTF8
????wchar_t*?wszString?=?L"abcd1234你我他";
????
//預轉換,得到所需空間的大小,這次用的函數和上面名字相反
????int?u8Len?=?::WideCharToMultiByte(CP_UTF8,?NULL,?wszString,?wcslen(wszString),?NULL,?0,?NULL,?NULL);
????
//同上,分配空間要給'\0'留個空間
????
//UTF8雖然是Unicode的壓縮形式,但也是多字節字符串,所以可以以char的形式保存
????char*?szU8?=?new?char[u8Len?+?1];
????
//轉換
????
//unicode版對應的strlen是wcslen
????::WideCharToMultiByte(CP_UTF8,?NULL,?wszString,?wcslen(wszString),?szU8,?u8Len,?NULL,?NULL);
????
//最后加上'\0'
????szU8[u8Len]?=?'\0';
????
//MessageBox不支持UTF8,所以只能寫文件

????
//接下來寫入文本
????
//寫文本文件,UTF8的BOM是0xbfbbef
????CFile?cFile;
????cFile.Open(_T(
"1.txt"),?CFile::modeWrite?|?CFile::modeCreate);
????
//文件開頭
????cFile.SeekToBegin();
????
//寫BOM,同樣低位寫在前
????cFile.Write("\xef\xbb\xbf",?3);
????
//寫入內容
????cFile.Write(szU8,?u8Len?*?sizeof(char));
????cFile.Flush();
????cFile.Close();
????delete[]?szU8;
????szU8?
=NULL;

}

UTF8轉UNICODE

void?CConvertDlg::OnBnClickedButtonU8ToUnicode()
{
????
//UTF8?to?Unicode
????
//由于中文直接復制過來會成亂碼,編譯器有時會報錯,故采用16進制形式
????char*?szU8?=?"abcd1234\xe4\xbd\xa0\xe6\x88\x91\xe4\xbb\x96\x00";
????
//預轉換,得到所需空間的大小
????int?wcsLen?=?::MultiByteToWideChar(CP_UTF8,?NULL,?szU8,?strlen(szU8),?NULL,?0);
????
//分配空間要給'\0'留個空間,MultiByteToWideChar不會給'\0'空間
????wchar_t*?wszString?=?new?wchar_t[wcsLen?+?1];
????
//轉換
????::MultiByteToWideChar(CP_UTF8,?NULL,?szU8,?strlen(szU8),?wszString,?wcsLen);
????
//最后加上'\0'
????wszString[wcsLen]?=?'\0';
????
//unicode版的MessageBox?API
????::MessageBoxW(GetSafeHwnd(),?wszString,?wszString,?MB_OK);

????
//寫文本同ansi?to?unicode
}



Ansi轉換utf8和utf8轉換Ansi就是上面2個的結合,把unicode作為中間量,進行2次轉換即可

總結

以上是生活随笔為你收集整理的Ansi、Unicode、UTF8字符串之间的转换和写入文本文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。