📄 lantranformtable.cpp
字号:
/////////////////////////////////////////////////////////////////
// 转换码表生成程序
// 作者: Janhail Luo
// 最后整理: 2003-03-03
/////////////////////////////////////////////////////////////////
#include <stdio.h>
#include "LanTranformTable.h"
// 构造函数
CLanTransformTable::CLanTransformTable()
{
}
// 析构函数
CLanTransformTable::~CLanTransformTable()
{
}
/* 检测一个首字节为bFirst,尾字节为bSecond的编码是否
是BIG5的字符。
|---------------------------------------------------|
| BIG5的编码范围 |
|---------------------------------------------------|
| 符号 | A140-A3FE |
|----------+----------------------------------------|
| 常用字 | A440-C67E |
|----------+----------------------------------------|
| 次常用字 | C940-F9FE |
|----------+----------------------------------------|
| 空白区 | A040-A0FE, C6A1-C8FE, FA40-FEFE |
|---------------------------------------------------|
*/
bool CLanTransformTable::IsBIG5Char(unsigned char bFirst, unsigned char bSecond)
{
if ( ! ((bSecond>=0x40 && bSecond<=0x7E)
||(bSecond>=0xA1 && bSecond<=0xFE)))
return false;
// 符号 A140-A3FE
if (bFirst>=0xA1 && bFirst<=0xA3)
{
// 实际只到A3BF
if ( (bFirst==0xA1 && bSecond<0x40)
|| (bFirst==0xA3 && bSecond>0xBE))
return false;
return true;
}
// 常用字 A440-C67E
if (bFirst>=0xA4 && bFirst<=0xC6)
{
if ( (bFirst==0xA4 && bSecond<0x40)
|| (bFirst==0xC6 && bSecond>0x7E))
return false;
return true;
}
// 次常用字 C940-F9FE
if (bFirst>=0xC9 && bFirst<=0xF9)
{
if ( (bFirst==0xC9 && bSecond<0x40)
|| (bFirst==0xF9 && bSecond>0xFE))
return false;
return true;
}
return false;
}
/* 检测一个首字节为bFirst,尾字节为bSecond的编码是否
是GB2312的字符。
|---------------------------------------------------|
| GB2312的编码范围 |
|---------------------------------------------------|
| 非汉字 | A1A1-A9FE |
|----------+----------------------------------------|
| 汉字 | B0A1-F7FE |
|---------------------------------------------------|
*/
bool CLanTransformTable::IsGB2312Char(unsigned char bFirst, unsigned char bSecond)
{
// 总体范围是 8140-FEFE, 剔除xx7F
if (bFirst <0x81 || bFirst>0xFE
|| bSecond<0x40 || bSecond>0xFE || bSecond==0x7F)
return false;
// GB2312非汉字(GBK/2) A1A1-A9FE
if (bFirst>=0xA1 && bFirst<=0xA9 && bSecond>=0xA1 && bSecond<=0xFE)
return true;
// GB2312汉字(GBK/2) B0A1-F7FE
if (bFirst>=0xB0 && bFirst<=0xF7 && bSecond>=0xA1 && bSecond<=0xFE)
return true;
// 其他
return false;
}
// 创建文件名为lpFileName的BIG5的转换码表文件
bool CLanTransformTable::CreateBIG5Table(const char* lpszFileName)
{
FILE *fp;
// 打开文件
fp = fopen(lpszFileName, "wb");
if (fp==0)
{
// 文件打开或者创建失败
return false;
}
// 写入文件头信息
this->WriteHeadInformation(fp);
unsigned char firstByte; // 首字节
unsigned char secondByte; // 第二字节
unsigned char space=0x20; // 空格符号
unsigned char r1=0x0D, r2=0x0A; // 回车换行符号
for (firstByte=0xA1; firstByte<=0xFE; firstByte++)
{
for (secondByte=0x40; secondByte<=0x7E; secondByte++)
{
if (IsBIG5Char(firstByte, secondByte))
{
// 写入编码
fwrite(&firstByte,1,1,fp);
fwrite(&secondByte,1,1,fp);
}else
{ // 不是BIG5字符,就写入空格填充
fwrite(&space,1,1,fp);
fwrite(&space,1,1,fp);
}
}
for (secondByte=0xA1; secondByte<=0xFE; secondByte++)
{
if (IsBIG5Char(firstByte, secondByte))
{ // 写入编码
fwrite(&firstByte,1,1,fp);
fwrite(&secondByte,1,1,fp);
}else
{ // 不是BIG5字符,就写入空格填充
fwrite(&space,1,1,fp);
fwrite(&space,1,1,fp);
}
}
// 为了加快查表的速度,我们使每行凑足160*2个字节
fwrite(&space,1,1,fp);
fwrite(&space,1,1,fp);
fwrite(&space,1,1,fp);
fwrite(&space,1,1,fp);
// 回车换行
fwrite(&r1,1,1,fp);
fwrite(&r2,1,1,fp);
}
// 写入文件尾信息
this->WriteTailInformation(fp);
// 关闭文件
fclose(fp);
// 写入信息完成
return true;
}
// 创建文件名为lpFileName的GB2312的转换码表文件
bool CLanTransformTable::CreateGB2312Table(const char* lpszFileName)
{
FILE *fp;
// 打开文件
fp = fopen(lpszFileName, "wb");
if (fp==0)
{
// 文件打开或者创建失败
return false;
}
// 写入文件头信息
this->WriteHeadInformation(fp);
unsigned char firstByte; // 首字节
unsigned char secondByte; // 第二字节
unsigned char space=0x20; // 空格符号
unsigned char r1=0x0D, r2=0x0A; // 回车换行符号
for (firstByte=0xA1; firstByte<=0xF7 ; firstByte++)
{
for (secondByte=0xA1; secondByte<=0xFE; secondByte++)
{
if (IsGB2312Char(firstByte, secondByte))
{ // 写入编码
fwrite(&firstByte,1,1,fp);
fwrite(&secondByte,1,1,fp);
}else
{ // 不是GB2312字符,就写入空格填充
fwrite(&space,1,1,fp);
fwrite(&space,1,1,fp);
}
}
// 为了加快查表的速度,我们使每行凑足96*2个字节
fwrite(&space,1,1,fp);
fwrite(&space,1,1,fp);
// 回车换行
fwrite(&r1,1,1,fp);
fwrite(&r2,1,1,fp);
}
// 写入文件尾信息
this->WriteTailInformation(fp);
// 关闭文件
fclose(fp);
// 写入信息完成
return true;
}
// 写文件头部的信息
void CLanTransformTable::WriteHeadInformation(void *fpFile)
{
FILE* fp = (FILE*)fpFile;
// 这里写文件头部的信息
}
// 写文件尾部的信息
void CLanTransformTable::WriteTailInformation(void *fpFile)
{
FILE* fp = (FILE*)fpFile;
// 这里写文件尾部的信息
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -