又一个代码页检测问题

时间:2011-08-09 12:43:45

标签: c# codepages

好的,在你用长矛向我跳并带我去代码页的燃烧战场之前,请注意我并不是要自动检测文本的代码页。我知道那是不可能的。 但我不知道的是自动检测代码页问题。以下面的例子为例。我有一个较大的文本(2-3页)加上一个“默认”代码页。我尝试使用默认代码页解码文本。如果我得到胡言乱语,我会尝试用另一个代码页解码文本。所以问题是:是否有可能以某种方式检测乱码?

感谢您的帮助。 最好的祝福, 丹尼尔

1 个答案:

答案 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',正如我前面所描述的那样,然后根据看起来不错的东西和没有看到的东西手动调整掩码。