Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在某些环境中,文件中缺少字符_C#_File Io_C# 2.0 - Fatal编程技术网

C# 在某些环境中,文件中缺少字符

C# 在某些环境中,文件中缺少字符,c#,file-io,c#-2.0,C#,File Io,C# 2.0,这对我来说是全新的,我不知道从哪里开始。我有一个子类,它从本地网络上的旧纯文本文件加载数据以填充自身 这些文件有一些标题行,然后每行的数据用一行破折号分隔,直到每页有一定数量的行,之后标题会重复 最近,有人要求增加对最初不需要的数据的支持。此数据的标题列数不相同。相反,我决定在每组数据中寻找一个特殊字符。代码如下所示: /// <summary> /// Load the work order information from the chart on the network. //

这对我来说是全新的,我不知道从哪里开始。我有一个子类,它从本地网络上的旧纯文本文件加载数据以填充自身

这些文件有一些标题行,然后每行的数据用一行破折号分隔,直到每页有一定数量的行,之后标题会重复

最近,有人要求增加对最初不需要的数据的支持。此数据的标题列数不相同。相反,我决定在每组数据中寻找一个特殊字符。代码如下所示:

/// <summary>
/// Load the work order information from the chart on the network.
/// </summary>
/// <param name="workOrder">Work order to load</param>
/// <param name="model">Model number of the work order to load. Loaded from MES if null.</param>
public WorkOrderInformation(String workOrder, String model)
{
    if (model == null)
        model = MES.getOrder(workOrder).Model;

    String fileLocation = Path.Combine(Path.Combine(WorkOrderLocation, model), workOrder.Insert(4, "-") + ".TXT");

    StreamReader file = new StreamReader(File.Open(fileLocation, FileMode.Open, FileAccess.Read));

    int currentLineNumber = 0;
    while (!file.EndOfStream)
    {
        string line = file.ReadLine();
        Logging.Log.writeLog(log, "Loaded line | " + line);
        currentLineNumber++;
        int lineOnPage =(currentLineNumber % 59);
        // Old way to determine if line contains data
        //if (lineOnPage >= 10 && lineOnPage % 2 == 0)
        if (line.Contains(((char)65533).ToString()))
        {
            Logging.Log.writeLog(log, "Line added to collection");
            string[] sections = line.Split(new char[] { '|' });

            if (sections.Length > 1)
            {
                UnitInfo newUnit = new UnitInfo(sections[0].Trim());
                for (int j = 1; j < sections.Length; j++)
                {
                    newUnit.Add(sections[j].Trim());
                }
                this.Add(newUnit.TestNumber,newUnit);
            }
        }
    }
    file.Close();
}
这让我的工作完成了,但我仍然很好奇为什么会发生这种情况,我会留下这个问题,希望至少能有一个解释

编辑3:

它似乎比我想象的更坏。如前所述,我搜索的0xFFFD值实际上是它显然不应该的值。由于无法从打印输出中识别字符,我在十六进制编辑器中打开了文件,发现该字符应该是0x00F8ø


因此,StreamReader似乎要么加载0x00F8作为替换字符,要么根本不加载。现在的问题是为什么?

我非常好奇您是如何产生以下代码的:

if (line.Contains(((char)65533).ToString()))
Unicode 65533或0xFFFD是一种特殊字符,称为。此字符的用途是用来代替某些未知或不可表示的字符

因此,它出现在一行文本中通常意味着还有一些其他字符由于某种原因无法复制。原因可能是编码、字体等


仅仅是你期望找到这个符号这一事实似乎是一个根本性的缺陷。你认为这个角色来自哪里?它将如何在文件中结束?

可能是一个编码问题。这里有一个问题显示如何将其设置为默认值@蒂科布:哦,那是有道理的。我甚至不知道编码可能会因环境的不同而有所不同,但如果是这种情况,我宁愿使用接受编码参数的StreamReader构造函数。如何确定Windows 7使用的是哪种编码?所以我可能会用同样的一个,因为它似乎有效。是的,我只是不确定你现在测试什么更容易。我不知道你在哪里可以找到Windows7。我认为这只是标准编码.Unicode。您可以随时调用Encoding.Default和breakpoint来查看您在这台机器上得到了什么。@TyCobb在我等待的时候,我尝试使用Encoding.Unicode,但这会使它将所有字符解释为亚洲字符。我在我的开发机器上检查了Encoding.Default,它的类型是System.Text.SBCSCodePageEncoding,这是我从未听说过的。然后我继续尝试Encoding.UTF8,它在我的开发机器上完成了工作,但当我将更新部署到XP机器上时,它仍然无法工作。FYI SBCS代表单字节字符集。此编码使用ISO-8859-1。ISO-8859-1又名拉丁语-1和UTF-8对ASCII编码相同;但是ISO-8859-1是固定长度的单字节编码,而UTF-8是可变长度的,它可以是单字节或多字节。Joel Spolsky比我解释得更好,你看,这是一个我在其他任何地方都没有见过的角色,但我在调试时通过查看相关符号的char值得到了这个值。这些文件不是内部生成的,由我们的一个零件供应商提供。它看起来很模糊,但是有一条垂直的线,而不是倾斜的线。这可能是希腊字母Phi,但Phi的Unicode绝对不是0xFFFD。在识别字符代码时一定有错误,也许可以尝试用十六进制编辑器打开它进行双重检查。有趣。有机会我会查一查。考虑到这个假期,这可能是一个很热的时刻。我对这个角色的记忆似乎很模糊,这是我以前找到的角色,而不是Phi。检查十六进制可以确认这一点,但这仍然不能解决StreamReader无法正确加载字符的问题。我更新了我的问题,以反映这一信息。我相信这个字符在斯堪的纳维亚语中使用。我认为你需要回到零件供应商那里。字符可能是由于数据输入和/或文件生成过程中的小故障/类型造成的-如果您以前没有在供应商数据中看到重音字符,这是一个合理的假设。另一方面,如果重音字符事实上是正确的,那么您可能需要处理其他重音字符,甚至可能是非西方字符。
if (line.Contains(((char)65533).ToString()))