⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lantranformtable.cpp

📁 一本书里的代码
💻 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 + -