首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >还有另一个代码页检测问题

还有另一个代码页检测问题
EN

Stack Overflow用户
提问于 2011-08-09 20:43:45
回答 1查看 387关注 0票数 3

好了,在您用长枪攻击我并将我带到代码页的战场之前,请注意,我并不是试图自动检测文本的代码页。我知道这不可能。但我所不知道的是自动检测代码页问题。请看下面的例子。我有一个较大的文本(2-3页)加上一个“默认”代码页。我尝试使用默认代码页对文本进行解码。如果我得到了胡言乱语,我会尝试用另一个代码页解码文本。所以问题是:有没有可能以某种方式检测胡言乱语的字符?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-09 21:02:28

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

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

构建掩模将需要相当多的手动工作。创建一个包含每个字符的页面,然后使用适当的代码页显示它,然后查看哪些字符呈现得不是很好。对于每个代码页,这都是一次性的活动,因此可能值得付出努力。

当然,如果有一种方法可以解析代码页,您可以自动生成此掩码...嗯..。一会儿就回来。

试一下这段代码。它根据每个已知代码页测试字符32-255。

代码语言:javascript
复制
        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代码页可能需要更多的关注,我还没有看过。但试着以此为起点。

我会使用这样的代码来构建一个初始的“掩码”,就像我之前描述的那样,然后根据什么看起来好,什么不好,手动调整这个掩码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6996361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档