System.Text.Encoding.GetEncoding( "iso-8859-1" ) бросает PlatformNotSupportedException?

См. тему, обратите внимание, что этот вопрос относится только к платформе .NET compact. Это происходит на эмуляторах, которые поставляются с Windows Mobile 6 Professional SDK, а также на моем английском HTC Touch Pro (все .NET CF 3.5). iso-8859-1 означает западноевропейский (ISO), который, вероятно, является самым важным кодированием помимо us-ascii (по крайней мере, когда число идет по количеству сообщений usenet).

Мне сложно понять, почему эта кодировка не поддерживается, а следующие поддерживаются (опять же на эмуляторах и на моем HTC):

  • iso-8859-2 (Центральноевропейский (ISO))
  • iso-8859-3 (латынь 3 (ISO))
  • iso-8859-4 (Baltic (ISO))
  • iso-8859-5 (кириллица (ISO))
  • iso-8859-7 (греческий (ISO))

Итак, поддержка греческого языка важнее, чем поддержка немецкого, французского и испанский? Может ли кто-нибудь пролить свет на это?

Спасибо!

Андреас

Ответы

Ответ 1

Я бы попытался использовать "windows-1252" в качестве строки кодировки. Согласно Википедии, Windows-1252 является надмножеством ISO-8859-1.

System.Text.Encoding.GetEncoding(1252)

Ответ 2

В этой статье MSDN говорится:

Поддержка .NET Compact Framework кодировка символов на всех устройствах: Unicode (BE и LE), UTF8, UTF7 и ASCII.

Существует ограниченная поддержка кодовой страницы кодирования и только в том случае, если кодирование признанных операционной системой устройства.

.NET Compact Framework выдает PlatformNotSupportedException, если a требуемая кодировка недоступна в устройства.

Я считаю, что все (или, по крайней мере, многие) кодировки ISO кодируются кодовыми страницами и подпадают под правило ограниченной поддержки. UTF8, вероятно, лучший выбор в качестве замены.

Ответ 3

Я знаю его немного позже, но я сделал реализацию для .net cf кодировки ISO-8859-1, надеюсь, это могло бы помочь:

namespace System.Text
{
    public class Latin1Encoding : Encoding
    {
        private readonly string m_specialCharset = (char) 0xA0 + @"¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";

        public override string WebName
        {
            get { return @"ISO-8859-1"; }
        }

        public override int CodePage
        {
            get { return 28591; }
        }

        public override int GetByteCount(char[] chars, int index, int count)
        {
            return count;
        }

        public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex)
        {
            if (chars == null)
                throw new ArgumentNullException(@"chars", @"null array");
            if (bytes == null)
                throw new ArgumentNullException(@"bytes", @"null array");
            if (charIndex < 0)
                throw new ArgumentOutOfRangeException(@"charIndex");
            if (charCount < 0)
                throw new ArgumentOutOfRangeException(@"charCount");
            if (chars.Length - charIndex < charCount)
                throw new ArgumentOutOfRangeException(@"chars");
            if (byteIndex < 0 || byteIndex > bytes.Length)
                throw new ArgumentOutOfRangeException(@"byteIndex");

            for (int i = 0; i < charCount; i++)
            {
                char ch = chars[charIndex + i];
                int chVal = ch;
                bytes[byteIndex + i] = chVal < 160 ? (byte)ch : (chVal <= byte.MaxValue ? (byte)m_specialCharset[chVal - 160] : (byte)63);
            }

            return charCount;
        }

        public override int GetCharCount(byte[] bytes, int index, int count)
        {
            return count;
        }

        public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex)
        {
            if (chars == null)
                throw new ArgumentNullException(@"chars", @"null array");
            if (bytes == null)
                throw new ArgumentNullException(@"bytes", @"null array");
            if (byteIndex < 0)
                throw new ArgumentOutOfRangeException(@"byteIndex");
            if (byteCount < 0)
                throw new ArgumentOutOfRangeException(@"byteCount");
            if (bytes.Length - byteIndex < byteCount)
                throw new ArgumentOutOfRangeException(@"bytes");
            if (charIndex < 0 || charIndex > chars.Length)
                throw new ArgumentOutOfRangeException(@"charIndex");

            for (int i = 0; i < byteCount; ++i)
            {
                byte b = bytes[byteIndex + i];
                chars[charIndex + i] = b < 160 ? (char)b : m_specialCharset[b - 160];
            }

            return byteCount;
        }

        public override int GetMaxByteCount(int charCount)
        {
            return charCount;
        }

        public override int GetMaxCharCount(int byteCount)
        {
            return byteCount;
        }
    }
}

Ответ 4

Вы пробовали использовать верхний регистр имени набора символов? Официальная регистрация не включает нижестоящее имя, которое вы предоставили (что не объясняет, почему оно принимает версии с нижним регистром другого ISO-8859 варианты).

Name: ISO_8859-1:1987                                    [RFC1345,KXS2]
MIBenum: 4
Source: ECMA registry
Alias: iso-ir-100
Alias: ISO_8859-1
Alias: ISO-8859-1 (preferred MIME name)
Alias: latin1
Alias: l1
Alias: IBM819
Alias: CP819
Alias: csISOLatin1

Ответ 5

Нечетно, что 8859-1 не поддерживается, но при этом UTF-8 имеет возможность представлять все 8859-1 символов (и более), поэтому есть причина, по которой вы не можете просто вместо этого использовать UTF-8? Это то, что мы делаем внутренне, и я только что затронул почти этот же вопрос сегодня. Положительная сторона использования UTF-8 заключается в том, что вы получаете поддержку для языков на востоке и кириллице без внесения изменений и без добавления веса на западные языки.

Ответ 6

Если кто-то получает исключение (.NET compact framework), например:

System.Text.Encoding.GetEncoding("iso-8859-1") throws PlatformNotSupportedException,

выполните следующие действия:

byte [] bytes = Encoding.Default.GetBytes(yourText.ToString);

Код:

FileInfo fileInfo = new FileInfo(FullfileName); //file type :  *.text,*.xml 
string yourText = (char) 0xA0 + @"¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ";

using (FileStream s = fileInfo.OpenWrite()) {
                    s.Write(Encoding.Default.GetBytes(yourText.ToString()), 0, yourText.Length);
}