好的,在你用长矛向我跳并带我去代码页的燃烧战场之前,请注意我并不是要自动检测文本的代码页。我知道那是不可能的。 但我不知道的是自动检测代码页问题。以下面的例子为例。我有一个较大的文本(2-3页)加上一个“默认”代码页。我尝试使用默认代码页解码文本。如果我得到胡言乱语,我会尝试用另一个代码页解码文本。所以问题是:是否有可能以某种方式检测乱码?
感谢您的帮助。 最好的祝福, 丹尼尔
答案 0 :(得分:2)
我认为唯一可行的方法是为每个代码页手动定义某种“掩码”;一个结构,定义您认为对每个代码页有效的所有字符值。
然后,您可以检查该页面是否包含此掩码中未包含的任何字符值。
构建蒙版将需要相当多的手动工作。创建一个包含每个字符的页面,然后使用相应的代码页显示它,然后查看哪些不能很好地呈现。这是每个代码页的一次性活动,所以也许值得付出努力。
当然,如果有办法解析代码页,你可以自动生成这个掩码......嗯......稍微回过头来。
试试这段代码。它针对每个已知的代码页测试字符32-255。
StringBuilder source = new StringBuilder();
for (int ix = 0; ix < 224; ix++)
{
source.Append((char)(ix + 32));
}
EncodingInfo[] encs = Encoding.GetEncodings();
foreach (var encInfo in encs)
{
System.Console.WriteLine(encInfo.DisplayName);
Encoding enc = Encoding.GetEncoding(encInfo.CodePage);
var result = enc.GetBytes(source.ToString().ToCharArray());
for (int ix = 0; ix < 224; ix++)
{
if (result[ix] == 63 && source[ix] != 63)
{
// Code page translated character to '?'
System.Console.Write("{0:d}", source[ix]);
}
}
System.Console.WriteLine();
}
我在调试器中环顾四周,注意到'?'如果源代码字符未包含在代码页中,则用作后备字符。检查'?' (并确保它不是'?'开头),代码假定代码页无法处理它。
DBCS代码页可能需要更多关注,我没看过。但请以此为出发点。
我使用这样的代码来构建一个初始的'mask',正如我前面所描述的那样,然后根据看起来不错的东西和没有看到的东西手动调整掩码。