程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Ansi,UTF8,Unicode編碼(續)

Ansi,UTF8,Unicode編碼(續)

編輯:C++入門知識

Ansi字符串我們最熟悉,英文占一個字節,漢字2個字節,以一個\0結尾,常用於txt文本文件。
Unicode字符串,每個字符(漢字、英文字母)都占2個字節;在VC++的世界裡,Microsoft比較鼓勵使用Unicode,如wchar_t。
UTF8是Unicode一種壓縮形式,英文A在unicode中表示為0x0041,英語中這種存儲方式太浪費,因為浪費了50%的空間,於是就把英文壓縮成1個字節,成了utf8編碼;但是漢字在utf8中占3個字節,顯然用做中文不如ansi合算,這就是中國的網頁用作ansi編碼而國外的網頁常用utf8的原因。程序中把15.7M大小UTF8格式的txt文件轉化為ANSI後,大小僅為10.8M。

一般情況下,可以通過Windows頭文件下的兩個函數實現各個類型之間的轉換。頭文件添加:

#include <Windows.h>

多字節字符集 -> Unicode字符集

  __in   DWORD dwFlags, 
  __in   LPCSTR lpMultiByteStr, 
  __in    cbMultiByte, 
  __out  LPWSTR lpWideCharStr, 
  __in    cchWideChar        
);

Unicode字符集 –> 多字節字符集

  __in   DWORD dwFlags,   
  __in   LPCWSTR lpWideCharStr, 
  __in    cchWideChar,       
  __out  LPSTR lpMultiByteStr,  
  __in    cbMultiByte,       

);

只有一個字符在 CodePage 制定的代碼頁中沒有對應的表示時,WideCharToMultiByte 才會使用後兩個參數。在遇到一個不能轉換的字符時,函數便使用 lpDefaultChar 參數指向的字符。如果這個參數指向為 NULL ,函數就會使用一個默認的字符。這個默認的值通常是一個問號。這對文件操作是非常危險的,因為問號是一個通配符。

程序的頭文件:

<iostream><><fstream><Windows.h> 
 std::  std;

ANSI轉Unicode

* sAnsi = 
     sLen = MultiByteToWideChar(CP_ACP, NULL, sAnsi, -, NULL, * sUnicode = 
    MultiByteToWideChar(CP_ACP, NULL, sAnsi, -,);
    rtxt.write((*)sUnicode, sLen*=
}

Unicode轉ANSI

*sUnicode = L
     sLen = WideCharToMultiByte(CP_ACP, NULL, sUnicode, -, NULL, * sAnsi =  
    WideCharToMultiByte(CP_ACP, NULL, sUnicode, -=
}

Unicode轉UTF8

*sUnicode = L
     sLen = WideCharToMultiByte(CP_UTF8, NULL, sUnicode, -, NULL, 
    * sUtf8 =  
    WideCharToMultiByte(CP_UTF8, NULL, sUnicode, -, );
=

UTF8轉Unicode

    * sUtf8 = 
     sLen = MultiByteToWideChar(CP_UTF8, NULL, sUtf8, -, NULL, * sUnicode = -,*)sUnicode, sLen*=

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

在網絡傳輸中,我們常常使用UTF8編碼,但在程序處理時,我們習慣於ANSI編碼,至少目前的VS2010對UTF8碼的顯示是亂碼的。以下函數綜合上述程序,實現了txt文件UTF8編碼向ANSI編碼的轉化。


* changeTxtEncoding(* wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, -, NULL, * wszString = -<<wszString<< ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, -, NULL, , NULL, NULL);  
    * szAnsi =  - changeTextFromUtf8ToAnsi( * strLine= strResult=(!+=strLine+* changeTemp= [strResult.length()+=; 
    strcpy(changeTemp, strResult.c_str()); 
    * changeResult==

問題記錄:
a.String類型的length()和size()函數都返回字符串的真實大小,不包括'\0‘ ;
b.char*類型的strlen()函數也是返回字符串的真實大小,不包括'\0‘ ;
c.注意,sizeof()函數包含'\0‘ ,如char str[] = “Hello” ;則sizeof (str ) = 6。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved