程序所用文档如图,我需要处理这些数据,把它变成
我的代码是这样的
#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语法好像没有错,为什么代码没有高亮