另一个代码页检测问题

本文关键字:问题 检测 代码 另一个 | 更新日期: 2023-09-27 18:05:12

好吧,在你拿着长矛向我扑来,把我带到代码页的燃烧战场之前,请注意,我不是在尝试自动检测文本的代码页。我知道这不可能。但是我不知道是否可以自动检测代码页问题。以以下示例为例。我有一个较大的文本(2-3页)加上一个"默认"代码页。我尝试用默认代码页解码文本。如果我得到乱码,我尝试用另一个代码页解码文本。所以问题是:是否有可能以某种方式检测到乱码字符?

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

另一个代码页检测问题

我认为唯一实用的方法是手动为每个代码页定义某种"掩码";一种结构,它定义了您认为对每个代码页有效的所有字符值。

然后,您可以检查页面是否包含此掩码中未包含的任何字符值。

构建遮罩将涉及相当多的手工工作。为每个字符创建一个页面,然后使用适当的代码页面显示它,然后查看哪些没有"很好"地呈现。这是每个代码页的一次性活动,所以也许值得付出努力。

当然,如果有一种方法来解析代码页,你可以自动生成这个掩码…嗯…马上回来。

试试这个代码片段。它针对每个已知的代码页测试字符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代码页可能需要更多的关注,我没有看过。但是可以从这个开始。

我将使用像这样的代码来构建一个初始的"蒙版",正如我之前所描述的,然后手动调整这个蒙版,基于什么看起来好,什么不。