所以,在我恍然大悟之前,我的头撞在墙上已经有一段时间了。我有一些代码将名单列表保存到文本文件ala ...
System.IO.File.WriteAllLines(dlg.FileName, this.characterNameMasterList.Distinct().ToArray());
字符名称可以包含特殊字符。这些名字来自www.wowarmory.com的wow armory。.txt文件中保存了大约26000个名字。
名称会保存到.txt文件中。我编写了另一个应用程序,使用此代码从该.txt文件中读取这些名称
// download the names from the db
var webNames = this.DownloadNames("character");
// filter names and get ones that need to be added to the db
var localNames = new List<string>(System.IO.File.ReadAllLines(dlg.FileName));
foreach (var name in webNames)
{
if (localNames.Contains(name.Trim())) localNames.Remove(name);
}
return localNames;
...代码从我的网站下载已经在数据库中的名称列表。然后读取本地.txt文件并单独列出数据库中尚未包含的每个名称,以便稍后添加它。从.txt文件中读取的名称也可以正常读取,没有任何问题。
从localNames列表中删除名称时出现问题。 localNames是List类型。一旦localNames.Remove(name)被调用,列表中包含特殊字符的任何名称都会被破坏并转换成?字符。
所以我尝试用另一种方式来做...
// download the names from web that are already in the db
var webNames = this.DownloadNames("character");
// filter names and get ones that need to be added to the db
var localNames = new List<string>(System.IO.File.ReadAllLines(dlg.FileName));
int index = 0;
while (index < webNames.Count)
{
var name = webNames[index++];
var pos = localNames.IndexOf(name.Trim());
if (pos != -1) localNames.RemoveAt(pos);
}
return localNames;
..但是使用localNames.RemoveAt也会破坏列表中将特殊字符转换为?的项目。
这是List.remove方法的已知错误吗?有人知道吗?有没有其他人有这个问题?我还使用.NET Reflector来反汇编/检查list.remove和list.RemoveAt代码,它似乎正在调用一些外部复制函数。
除了这可能不是从2个列表中获取唯一项目列表的最佳方法之外,我在使用List.Remove方法时遗漏了某些内容或应该注意什么?
我正在运行Windows 7 vs2010,我的应用程序设置为.net 4(没有客户端配置文件)
答案 0 :(得分:4)
在检索名称,保存名称和读取名称时尝试强制使用UTF-8。
这可能会解决您的问题。
编辑:虽然此建议可能看似含糊不清 - 您只需要确保您的网站提供UTF-8(最有可能),并且在所有文件操作中,只需添加Encoding.UTF-8
即可。您会注意到所有File方法都有接受编码的重载。
答案 1 :(得分:2)
99次出100次您认为编译器或框架中存在错误......但事实并非如此。通常只是您对问题的理解是错误的。这并不是说框架没有错误,但大多数时候你认为错误的确不是。
根据您的描述,看起来更像是您用来查看数据的工具给出错误的视图,而不是实际的字符已转换为问号。您是否检查了十六进制代码以查看十六进制代码是否与编码问号字符等效?看起来好像没有。
答案 2 :(得分:0)
原来问题是* .txt文件中出现了错误的名称。至于那些坏人物如何在该名单中的名字中结束是另一回事。唯一的另一个可能性是因为我使用Distinct方法来过滤重复项。
这个问题让我困惑了一段时间,因为数据IE:角色名称来自使用utf-8编码的wowarmory.com网站。因为它来自那个网站,我以为我可以相信它。 Blizz限制你可以在字符名称中使用的字符。
我仍在尝试在我的代码中解决这个问题。但是由于数据太多而且数据中只有极少数条目被破坏,因此追踪问题真的很痛苦。特别是当代码在超过99%的条目上完美运行时。