【发布时间】:2013-12-23 16:28:31
【问题描述】:
这对我来说是全新的,我不知道从哪里开始。我有一个 Dictionary 子类,它从本地网络上的旧纯文本文件加载数据以填充自身。
文件有一些标题行,然后是数据(每行由一行破折号分隔),直到每页设定的行数 (59),之后标题重复。
最近有需求增加对最初不需要的数据的支持。此数据没有相同数量的标题列。相反,我决定在每组数据中寻找一个特殊字符。代码如下所示:
/// <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();
}
在我的开发机器 (Windows 7) 和一台部署机器 (Windows 2000) 上,它运行良好。在另一台部署机器 (Windows XP) 上,该字符根本不在行中。如果我检查我的日志,当我记录完整的行和记录“添加到集合的行”的语句时没有写入字符。
我在所有 3 台机器上的同一个文件上运行它。
编辑:
我已更改我的日志记录以存储加载的行的长度而不是行本身,并确认该字符只是从 string 中丢失。在它工作的机器上,日志说这些行的长度为 65 个字符,而在没有的机器上是 64 个。
编辑 2:
我决定重新考虑这个问题。我决定提前拆分字符串并检查第一个值是否是数字,而不是搜索那个特殊字符:
double dummy;
if(double.TryParse(sections[0],out dummy))
这完成了我的工作,但我仍然很好奇为什么会发生这种情况,并且会留下这个问题,希望至少能得到解释。
编辑 3:
似乎比我想象的更多。正如Dan 指出的那样,我正在搜索的值(0xFFFD)实际上是replacement character,它显然不应该是。无法从打印输出中识别字符我在十六进制编辑器中打开文件并发现字符问题应该是 0x00F8 (ø)。
看来 StreamReader 要么加载 0x00F8 作为替换字符,要么根本不加载。现在的问题是为什么?
【问题讨论】:
-
可能是编码问题。这是一个显示如何将其设置为默认值的问题。 stackoverflow.com/questions/469163/…
-
@TyCobb 哦,这很有道理。我什至不知道编码可能会因环境而异,但如果是这种情况,我宁愿只使用接受编码参数的 StreamReader 构造函数。如何确定 Windows 7 使用的是哪种编码? (这样我就可以使用同一个,因为这似乎有效)
-
是的,我只是不确定目前用什么更容易测试。我不确定在哪里可以找到适用于 Windows 7 的它。我认为它只是标准的
Encoding.Unicode。您总是可以临时调用Encoding.Default并设置断点以查看您在该机器上得到了什么。 -
@TyCobb 好吧,当我等待时,我尝试使用
Encoding.Unicode但这使它将所有字符都解释为亚洲字符。我在我的开发机器上检查了Encoding.Default,它是我从未听说过的System.Text.SBCSCodePageEncoding类型。然后我继续尝试Encoding.UTF8,它在我的开发机器上完成了工作,但是当我将更新部署到 XP 机器时它仍然无法工作。 -
仅供参考“SBCS”代表“单字节字符集”。此编码使用 ISO-8859-1。 ISO-8859-1(又名 Latin-1)和 UTF-8 对 ASCII 编码相同;但 ISO-8859-1 是固定长度(单字节)编码,而 UTF-8 是可变长度(可以是单字节或多字节)。 Joel (Spolsky) 比我能更好地解释这一点,请参阅 here。