youhou4333
2016-12-08 14:31
采纳率: 50%
浏览 874
已采纳

如何区分汉字"錒"和其他英文字符

实验用文档
程序所用文档如图,我需要处理这些数据,把它变成
预期结果
我的代码是这样的

#include <iostream>
#include <string>
#include <fstream>
#include <map>
#include <cstdlib>

using namespace std;

bool isLetterOrNumber(const char &word);
bool isChinese(const char &word);


int main(int argc, char* argv[])
{
    // 首先要打开这个文件,用二进制形式
    ifstream ifs("list_t.txt", ios::binary);
    // 需要把结果写入一个目标文件
    ofstream ofs("hz_pinyin.txt", ios::binary);
    // 需要一个临时存储字符
    char word;
    // 需要一个字符串存拼音
    string pinyin;
    // 需要一个字符串存汉字
    string chinese;
    // 我们需要通过汉字来检索拼音,所以需要一个从string到string的map
    map<string, string> table;

    // 错误处理,如果ifs指向NULL,结束程序
    if (!ifs)
    {
        cerr << "文件打开错误,请检查" << endl;
        exit(0);
    }
    // 打开文件后看见了下面这一行
    // a1 阿啊锕呵吖腌錒

    // 文件指针开始移动
    while (!ifs.eof())
    {
        // 先读取当前位置的字符
        ifs.read((char*)&word, 1);
        // 判断读到的字符是不是英文字符和数字(因为拼音是由英文字符和数字组成的)
        if (isLetterOrNumber(word)) // 錒的后一个字节内容是48h,到这一句会判断为真,连入pinyin,造成后面乱码
            // 放入pinyin字符串
            pinyin += word;
        // 判断读到的字符是不是中文
        else if (isChinese(word))
        {
            // 放入chinese字符串
             chinese += word;
            // 判断中文字符串长度是否为2,如果为2,chinese为索引,pinyin为对应值,存入map
            if (chinese.size() == 2)    
            {
                table[chinese] = pinyin;
                // 以<中文><拼音>形式存入新的文件
                ofs.write(chinese.c_str(), chinese.size());
                ofs.write(pinyin.c_str(), pinyin.size());
                // 接着清空chinese字符串,以迎接下一个汉字
                chinese.clear();
                // 往目标文件写入一个回车
                ofs.write("\r", 1);
                // 往目标文件写入一个换行
                ofs.write("\n", 1);
            }
        }
        // 如果读到了0x0D,那么清空pinyin字符串,并接着读一个0x0A
        else if (word == 0x0D)
        {
            pinyin.clear();
            ifs.read((char*)&word, 1);
        }
    }

    ifs.close();
    ofs.close();
    return 0;
}

bool isLetterOrNumber(const char &word)
{
    if ((word >= '0' && word <= '9') || (word >= 'a' && word <= 'z')
        || (word >= 'A' && word <= 'Z'))
        return true;
    return false;
}

bool isChinese(const char &word)
{
    if ((!isLetterOrNumber(word)) && (word != ' ') && (word != '\r')
        && (word != '\n'))
        return true;
    return false;
}

生成的结果是乱码。我用winhex查看了一下,问题发生在“錒”这个字上。錒的编码是"E5 48"它第二个字节的48正好是ASCII码中'H'的位置,也就是说,当word是"錒"的第二个字节,并且处理到

if (isLetterOrNumber(word))

会返回true,这个48就会按照英文来处理,放到拼音字符串中。

但是问题来了:既然"錒"的第二个字节是48,而48也在ASCII中,那么怎么才能区分出我想要的这个48是"錒"的第二字节,而不是'H'ASCII字符?

PS:我感觉我的markdown语法好像没有错,为什么代码没有高亮

图片说明

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • Ensue 2016-12-09 03:12
    已采纳

    逻辑改一下:
    if (isChinese(word))
    {
    chinese = word;
    ifs.read((char*)&word, 1); //既然是汉字,就得读两次组成一个汉字。
    chinese += word;
    现在肯定是汉字,无需判断是否等于2
    }
    else if (isLetterOrNumber(word)) // 排除汉字后才处理字符和数字
    // 放入pinyin字符串
    pinyin += word;

    已采纳该答案
    打赏 评论
  • 「已注销」 2016-12-08 15:23

    read就是按一个个字节读得啊。你得换数据流

    打赏 评论

相关推荐 更多相似问题