Ascii编码,是美国佬(ANSI美国家标准局)对常见符号的数值化的过程。数值化的原因是计算机只认得数字。
对事物编号,这是很普通的思想。继美国之后,很多国家地区纷纷对自已常见的符号进行数值化。他们受到
Ascii的影响。由于标准的Ascii是7位,只能表示128个符号,远远不够别的国家地区表示他们的符号,于是他
们对Ascii进行了扩展,比如对标准的Ascii加多了一个有效位,比如用两个扩展的Ascii(两个8位的)来表示一个
符号(像中国的gb2312就是用两个ascii表示一个中文)。由于各国各区的数值化是独立进行的,所以彼此的编码
互不兼容,一个数字1234,在世界范围可能找得出若干个对应的字符,这不利于“世界化”。ISO使用了“全世界统一
编码”的思想,把全世界的符号集中在一起,然后统一数值化,即Unicode编码。标准unicode不扩展ascii这个烂摊子,
直接使用16位表示一个符号(总共可以表示6万多个不同的符号)。
unicode中,中日韩(cjk)符号从0x3000到0x9FFF,汉字从0x4e00到0x9fa5。
Ascii是可以表示中文的,但同一个中文的ascii(两个)数值跟它的unicode值是不同的,而且这个ascii值在世界上
是有冲突的。
这个例子随机输出汉字:
// vs2008 xp
#include <tchar.h>
#include <Windows.h>
#include <cstdlib>
#include <clocale>
#include <cstring>
#include <iostream>
#include <string>
using namespace std;
void Test3()
{
int m = 0x9fa5 - 0x4e00 + 1;
setlocale(LC_ALL, "chs"); // 让输出函数知道正在使用unicode表示汉字
for (;;)
{
srand(GetTickCount());
int ret = rand();
ret = ret % m + 0x4e00;
wprintf(TEXT("%c "), TCHAR(ret));
/* 或者:
wstring s;
s += TCHAR(ret);
wcout << TCHAR(ret) << " ";
*/
Sleep(40);
}
}
这个例子可获得中文字符串的unicode值:
void GetStringUnicode(const wstring & srcString, int * pRetInt)
{
if (srcString.empty() || pRetInt == NULL)
{
return;
}
int t = 0;
for (int n = 0x4e00; n <= 0x9fa5; n ++)
{
if (t >= srcString.length())
{
break;
}
wstring str;
str += TCHAR(n);
for (int m = 0; m < srcString.length(); m ++)
{
wstring strTemp;
strTemp += srcString[m];
if (str == strTemp)
{
pRetInt[m] = n;
t ++;
}
}
}
}
// 根据unicode值打印出汉字
void PrintByUnicodeValue(int * pSrcInt)
{
setlocale(LC_ALL, "chs");
if (pSrcInt == NULL)
{
return;
}
int n = 0;
while (pSrcInt[n] != 0)
{
wstring s;
s += TCHAR(pSrcInt[n]);
wcout << s;
/*
或者:
wprintf(TEXT("%c "), TCHAR(pSrcInt[n]));
*/
n ++;
}
}
// 测试代码:
{
wstring targetString = _T("床前明月光疑是地上霜丫头");
int unicodeArr[64] = {0};
GetStringUnicode(targetString, unicodeArr);
int n = 0;
while (unicodeArr[n] != 0)
{
cout << unicodeArr[n] << " ";
n ++;
}
cout << endl;
PrintByUnicodeValue(unicodeArr);
cout << endl;
}