好了,在您用长枪攻击我并将我带到代码页的战场之前,请注意,我并不是试图自动检测文本的代码页。我知道这不可能。但我所不知道的是自动检测代码页问题。请看下面的例子。我有一个较大的文本(2-3页)加上一个“默认”代码页。我尝试使用默认代码页对文本进行解码。如果我得到了胡言乱语,我会尝试用另一个代码页解码文本。所以问题是:有没有可能以某种方式检测胡言乱语的字符?
提前感谢您的帮助。致以最好的问候,丹尼尔
发布于 2011-08-09 21:02:28
我认为唯一实用的方法是为每个代码页手动定义某种“掩码”;这种结构定义了您认为对每个代码页有效的所有字符值。
然后,您可以检查页面是否包含此掩码中未包含的任何字符值。
构建掩模将需要相当多的手动工作。创建一个包含每个字符的页面,然后使用适当的代码页显示它,然后查看哪些字符呈现得不是很好。对于每个代码页,这都是一次性的活动,因此可能值得付出努力。
当然,如果有一种方法可以解析代码页,您可以自动生成此掩码...嗯..。一会儿就回来。
试一下这段代码。它根据每个已知代码页测试字符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代码页可能需要更多的关注,我还没有看过。但试着以此为起点。
我会使用这样的代码来构建一个初始的“掩码”,就像我之前描述的那样,然后根据什么看起来好,什么不好,手动调整这个掩码。
https://stackoverflow.com/questions/6996361
复制相似问题