从Ascii说起

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;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值