3

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

提前感谢您的帮助。最好的问候,丹尼尔

4

1 回答 1

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 代码页可能需要更多注意,我没有看过。但试试这个作为起点。

如前所述,我将使用这样的代码来构建初始“掩码”,然后根据看起来不错和不好看的内容手动调整该掩码。

于 2011-08-09T13:02:28.130 回答