Silverlight 的 ANSI 编码实现

发布于 2024-11-04 20:47:52 字数 529 浏览 0 评论 0原文

我需要在我的 Silverlight 应用程序中对某些代码页进行编码实现。特别是我需要从 zip 存档中读取非英语文件名(打开 Application.GetResourceStream)。

Silverlight 仅包含 Unicode 编码(Encoding.UTF8、Encoding.Unicode、Encoding.BigEndianUnicode)。 Encoding.GetEncoding 对于其他编码名称会引发异常。

但我需要一些 ANSI 代码页(特别是 866)的 Encoding 类实现。在桌面上,我可以通过 Encoding.GetEncoding(866) 获取它。

我在哪里可以获得最简单的实现?

ps 我知道这个问题与 Silverlight 几乎没有关系,但如果不提及它,我会建议我使用 Encoding.GetEncoding 我猜..

I need Encoding implementation of some codepage in my Silverlight app. Particularly I need to read non-Engligh file names from zip-archive (being opened Application.GetResourceStream).

Silverlight contains only Unicode encodings (Encoding.UTF8, Encoding.Unicode, Encoding.BigEndianUnicode). Encoding.GetEncoding throws exception for other encoding names.

But I need Encoding class implementation for some ANSI codepage (866 particularly). On desktop I'd get it via Encoding.GetEncoding(866).

Where can I get the simplest implementation?

p.s. I understand that the question hardly relates Silverlight, but without mentioning it I'll be suggested to use Encoding.GetEncoding I guess..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

默嘫て 2024-11-11 20:47:52

http://en.wikipedia.org/wiki/Code_page_866 您可以构建地图并转换你的东西到UTF-8。

From http://en.wikipedia.org/wiki/Code_page_866 you can build a map and convert your stuff to UTF-8.

柏林苍穹下 2024-11-11 20:47:52

感谢@Bala_R,我得到了 866 代码页并写道:

    private byte[] translateInto866(string fileName)
    {
        const byte startCode1 = 128;        // А, 0410
        const byte startCode2 = 224;        // р, 0440

        var result = new byte[fileName.Length];
        int i = 0;
        foreach (char c in fileName)
        {
            if (c >= 'А' && c <= 'п')
            {
                result[i] = (byte)(((byte)(c - 'А')) + startCode1);
            }
            else if (c > 'п' && c <= 'я')
            {
                result[i] = (byte)(((byte)(c - 'р')) + startCode2);
            }
            else
            {
                result[i] = (byte) c;
            }
            i++;
        }
        return result;
    }

现在我们只需要了解使用什么代码页来编码文件名。我们在清单中有其 unicode 表示形式,在 zip 内有某种编码形式的表示形式。找到合适的编码应该不是很难。但就我而言,我只知道如果它不是 utf8,那么它就是 866。

Thanks to @Bala_R, i get 866 codepage and write:

    private byte[] translateInto866(string fileName)
    {
        const byte startCode1 = 128;        // А, 0410
        const byte startCode2 = 224;        // р, 0440

        var result = new byte[fileName.Length];
        int i = 0;
        foreach (char c in fileName)
        {
            if (c >= 'А' && c <= 'п')
            {
                result[i] = (byte)(((byte)(c - 'А')) + startCode1);
            }
            else if (c > 'п' && c <= 'я')
            {
                result[i] = (byte)(((byte)(c - 'р')) + startCode2);
            }
            else
            {
                result[i] = (byte) c;
            }
            i++;
        }
        return result;
    }

Now we only need to understand what codepage was used to encode file name. We have its unicode representation in manifest and a representation in some encoding inside zip. It should be not very hard to find appropriate encoding. But in my case I just know that if it's not utf8 then it's 866.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文