编码问题

本文关键字:问题 编码 | 更新日期: 2023-09-27 18:12:34

我有一个编码的大问题。我使用的代码应该工作,但它没有!

代码如下:

FileStream fs = new FileStream(saveFile, FileMode.Create, FileAccess.Write, FileShare.None);
System.IO.StreamWriter objWriter;
objWriter = new System.IO.StreamWriter(fs , Encoding.Unicode);
string textLine;
if (System.IO.File.Exists(readFile) == true)
{
    System.IO.StreamReader objReader;
    objReader = new System.IO.StreamReader(readFile, Encoding.Unicode);
    do 
    {
        textLine = objReader.ReadLine();
        if (textLine.IndexOf(searchString) != -1)
        {
            tempString = textLine;
            position1 = textLine.IndexOf(searchString);
            tempString = textLine.Substring(position1);
            if (tempString.IndexOf("(") != -1)
            {
                position2 = tempString.IndexOf("(");
                //MessageBox.Show(tempString.Length.ToString());
                tempString = tempString.Substring(0, position2);
            }
        }
        objWriter.WriteLine(textLine);
    } while (objReader.Peek() != -1);
}
objWriter.Close();
MessageBox.Show(tempString);
MessageBox.Show("Done!");

我必须读取一个混合了英文字符和一些西里尔字符的文件,但是在读取和处理文件之后,当我试图将文件保存到一个新的位置时,所有的西里尔符号都是"?"或其他一些未知的符号。我尝试了所有可能的编码,它不工作!

编码问题

从您发布的示例来看,该文件似乎没有BOM,但它包含西里尔字符。没有BOM, StreamReader不能猜测正确的编码。因此,您可以假设使用Windows-1251编码,因为该文件包含西里尔字符(根据您在注释部分中显示的HEX转储)。

你可以这样做:

using (var reader = new StreamReader("input.txt", Encoding.GetEncoding("Windows-1251")))
using (var writer = new StreamWriter("output.txt", false, Encoding.UTF8))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        // reading the input file line by line ...
        // perform the parsing and write to the UTF-8 output encoded file
        writer.WriteLine(line);
    }
}

如果您不确定输入文件的编码,请不要指定它,让StreamReader实现检查。

我怀疑你的源文件不是Unicode,而是使用你的本地Windows编码。

创建一个全新的文件,不要在读取器中指定任何编码。

objReader = new System.IO.StreamReader(readFile);