各位大大!请问要怎么随机生成汉字啊!
要实例!谢谢!!!
要实例!谢谢!!!
解决方案 »
- 调试的时候的问题
- MFC入门,请大家给点建议
- 请各位大虾帮忙看看我遇到的问题?
- 如何模拟WSAStartup()来加载一个Ws2_32.DLL(或者我自己的Socket功能)的拷贝?
- asp中的数组怎么在com中传入并解析处理后传出阿~~
- 简单入门问题,如何将int数转换为CString?
- 我已经用HOOK截获wsock32.dll的recv(),但截来的有用的数据都是一堆堆的数据包,如何分析这些数据包呢?
- 100分求助,请问如何实现程序运行过程中,CDialogbar中的按钮灰化?
- 三维图形怎样绘制??
- 联想选用APUSIC(www.apusic.com)J2EE应用服务器—袁红岗的java爱好者俱乐部
- 动态改变Dialog窗体的大小
- 使用doxygen的简单问题?
高字节范围是 x1-x2(具体自己查)
高字节范围是 y1-y2(具体自己查)
1.随机产生两个索引
srand(GetTickCount());
nLowPart = rand()%(x2-x1+1) + x1;
nHighPart = rand()%(y2-y1+1) + y1;
2.拼接索引显示汉字
unsigned char Chinese[3] = "??\0";
Chinese[0] = nHighPart;
Chinese[1] = nLowPart;
printf("汉字为:%s\n",Chinese);
楼主只要生成 1 字节 0xB0~0xF6 ,2 字节 0xa1 ~ 0xFE,就够随机的了.
srand((unsigned)time(NULL));
int iRange1 = 0xf7 - 0xb0;
int iRange2 = 0xfe - 0xa1;
for (int i=0;i<10;++i)
{
BYTE iCode1 = rand()%iRange1 + 0xb0;
BYTE iCode2 = rand()%iRange2 + 0xa1;
char ch[3] = {iCode1,iCode2,0};
cout<<ch<<endl;
}
试过是可行的代码
#include <fstream>
#include <iostream>
using namespace std;int main(){
int iRange1 = 0xf7 - 0xb0 + 1;
int iRange2 = 0xfe - 0xa1 + 1;
char ch[3];
ofstream ofs("hanzi.txt");
for (int i=0;i<iRange1;++i)
{
sprintf(ch,"%02d",i);
ch[2] = ' ';
ofs.write(ch,3);
for (int j=1;j<=iRange2;++j)
{
ch[0] = i + 0xb0;
ch[1] = j + 0xa0;
ch[2] = ' ';
ofs.write(ch,3);
if ((j+1)%16 == 0)
{
ofs.write(&"\n",1);
}
}
ch[0] = ch[1] = ch[2] = ' ';
ofs.write(ch,3);
ofs.write(&"\n\n",2);
}
ofs.close(); cout<<"hanzi create ok!,press and key to exit."<<endl;
cin.get(); return 0;
}
写了一个生成全部 GB2312 汉字的程序,可以试试.知道汉字怎么编码,要生成随机就很容易了.
GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。 01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。 举例来说,“啊”字是GB2312之中的第一个汉字,它的区位码就是1601。 字节结构
在使用GB2312的程序中,通常采用EUC储存方法,以便兼容于ASCII。 每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。例如“啊”字在大多数程序中,会以0xB0A1储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。