我正在尝试读取文本文件,对于每个单词,我会将它们放入二叉搜索树的节点中。但是,第一个字符总是被读作“+第一个字”。例如,如果我的第一个单词是“This”,那么插入我的节点的第一个单词是“This”。我一直在寻找解决方案来解决这个问题,有一篇文章在Java中提出同样的问题,但没有人用C ++解决过这个问题。有人帮我解决了吗?谢谢。
我找到了一个简单的解决方案。我在记事本中打开文件,并将其保存为ANSI。之后,文件正在读取并正确传递到二叉搜索树
答案 0 :(得分:16)
这是UTF-8的BOM
您需要将文件读为UTF-8。如果您不需要Unicode并且只使用前127个ASCII码点,则将文件保存为ASCII或UTF-8而不用BOM
答案 1 :(得分:4)
这是Byte Order Mark (BOM)。它是ISO-8859-1 中 UTF-8 BOM的表示。您必须告诉编辑不要使用BOM或使用其他编辑器去除它们。
在C ++中,您可以使用以下函数将UTF-8 BOM
文件转换为ANSI
。
void change_encoding_from_UTF8BOM_to_ANSI(const char* filename)
{
ifstream infile;
string strLine="";
string strResult="";
infile.open(filename);
if (infile)
{
// the first 3 bytes (ef bb bf) is UTF-8 header flags
// all the others are single byte ASCII code.
// should delete these 3 when output
getline(infile, strLine);
strResult += strLine.substr(3)+"\n";
while(!infile.eof())
{
getline(infile, strLine);
strResult += strLine+"\n";
}
}
infile.close();
char* changeTemp=new char[strResult.length()];
strcpy(changeTemp, strResult.c_str());
char* changeResult = change_encoding_from_UTF8_to_ANSI(changeTemp);
strResult=changeResult;
ofstream outfile;
outfile.open(filename);
outfile.write(strResult.c_str(),strResult.length());
outfile.flush();
outfile.close();
}
答案 2 :(得分:0)
在调试模式下查找特殊字符的符号,然后替换
content.replaceAll("\uFEFF", "");