機內碼高位字節=(區號)H+A0H
機內碼低位字節=(位號)H+A0H
例子:
string str = "陳"; // 機內碼存儲,占兩個字節
unsigned char ucHigh = (unsigned char)strText[0]; // 獲取機內碼高字節 ucHigh = 179
unsigned char ucLow = (unsigned char)strText[1]; // 獲取機內碼低字節 ucLow = 194
unsigned int uCode = (ucHigh - 0xA0) * 100 + ucLow - 0xA0; // 區位碼 uCode = (179 - 160) * 100 + 194 - 160 = 1934;
接下來就是根據區位碼 1934 找到對應的拼音,怎么找呢?看源碼吧。

#include <iostream>
#include <string>
using namespace std;
#define CONVERT(start, end, code, letter) if(code >= start && code <= end) return letter
char Convert(wchar_t n)
{
/// 根據漢字區域碼獲取拼音聲母
CONVERT(0xB0A1, 0xB0C4, n, 'a');
CONVERT(0XB0C5, 0XB2C0, n, 'b');
CONVERT(0xB2C1, 0xB4ED, n, 'c');
CONVERT(0xB4EE, 0xB6E9, n, 'd');
CONVERT(0xB6EA, 0xB7A1, n, 'e');
CONVERT(0xB7A2, 0xB8c0, n, 'f');
CONVERT(0xB8C1, 0xB9FD, n, 'g');
CONVERT(0xB9FE, 0xBBF6, n, 'h');
CONVERT(0xBBF7, 0xBFA5, n, 'j');
CONVERT(0xBFA6, 0xC0AB, n, 'k');
CONVERT(0xC0AC, 0xC2E7, n, 'l');
CONVERT(0xC2E8, 0xC4C2, n, 'm');
CONVERT(0xC4C3, 0xC5B5, n, 'n');
CONVERT(0xC5B6, 0xC5BD, n, 'o');
CONVERT(0xC5BE, 0xC6D9, n, 'p');
CONVERT(0xC6DA, 0xC8BA, n, 'q');
CONVERT(0xC8BB, 0xC8F5, n, 'r');
CONVERT(0xC8F6, 0xCBF0, n, 's');
CONVERT(0xCBFA, 0xCDD9, n, 't');
CONVERT(0xCDDA, 0xCEF3, n, 'w');
CONVERT(0xCEF4, 0xD188, n, 'x');
CONVERT(0xD1B9, 0xD4D0, n, 'y');
CONVERT(0xD4D1, 0xD7F9, n, 'z');
return '\0';
}
void Test_Invert()
{
string sChinese = "根據漢字區域碼獲取漢字首字母"; // 輸入漢字
wchar_t wchr = 0;
int nCount = sChinese.length() / 2;
char* buff = new char[nCount];
memset(buff, 0x00, sizeof(char)*nCount+1);
for (int i = 0, j = 0; i < nCount; ++i)
{
wchr = (sChinese[j++] & 0xff) << 8; // 高字節
wchr |= (sChinese[j++] & 0xff); // 低字節
buff[i] = Convert(wchr);
}
cout << "pin yin = [ " << buff << " ]" << endl;
}

例:
tempalte <typename T>
T GetMax(T a, T b)
{
return a < b ? b : a;
}
/// 重載
tempalte <typename T>
T GetMax(T a, T b, T c)
{
return (c < GetMax(a, b) ? GetMax(a, b) : c);
}
/// 默認類型
template <typename T=int>
T GetMax(T a, T b)
{
retrun a < b ? b : a;
}
2、Class Templates(類模版)
例:
template <typename T>
class MyStack
{
friend class CFriend1; // 普通友元類不需要先申明
friend class CFriend2<T>; // error, 友元模板類必須先申明
public:
void Push(T const&);
void Pop();
T Top() const;
bool Empty() const;
private:
std::vector<T> elems;
};
void MyStack<T>::Push(T const& e)
{
elems.push_back(e);
}
/// 繼承
template <typename T>
class Derived : public MyStack<T>
{
public:
void Test()
{
Top(); // 應該使用this->Top() 或 MyStack<T>::Top(), 否則就調用外部Top(),或者編譯錯誤
}
/// 成員模版函數,不能是virtual
template <typename T2>
void Test2()
{
}
};
3、NonType Templates(非類型模版參數)
局限性:通常只能是常數整數(包括enum)和指向局部變量的指針。
例:
template <typename T, int MAXSIZE>
struct NonTypeStruct
{
T elems[MAXSIZE];
};
4、typename 關鍵字
typename是在C++標準化工程中被引入的,目的是向編譯器說明template內部的某個表示符號是個類型。
例:
template<typename T>
struct MyStruct
{
typename T::SubType* m_Ptr; // 表示m_Ptr是指向SubType是T內部類型的一個指針,若沒有typename,就表
示T的靜態變量SubType乘以m_Ptr。
};
5、雙重模版參數
例:
template <typename T, template <typename> class CT>
class DoubleTemplate
{
CT<t> m_ct;
};
DoubleTemplate<int, std::vector> dbTemplate; // 類中定義了一個vector<int>的成員屬性m_ct;
6、模板的申明和定義必須在同一個文檔中,否則會出現連接錯誤
例:
// Test.h
template <typename T>
T Max(T a);
// Test.cpp
template <typename T>
T Max(T a) { return a; }
// Main.cpp
#include "Test.h"
void main()
{
int a = Max<int>(1); // error LNK2019,除非同時 #inclde "test.cpp"
}
7、模版類不能和其它不同類型的實體同名。
例:
int c;
class c; // ok,普通類可以
template <typename T>
class c; // error,模板類不行
8、在類中聲明友元模版類
例:
class Manager
{
template <typename T>
friend class Task;
};
9、看看小細節
例:
template <bool b>
class Invert
{
public:
static bool const result = !b;
};
bool bTest = Invert<(1>0)>::result; // (1>0)小括號必須存在
std::vector<std::list<int> > vectList; // <std::list<int> >空格必須存在