System.Text.Encoding.GetEncoding ("iso-8859-1") создает исключение PlatformNotSupportedException? - PullRequest
14 голосов
/ 29 декабря 2008

См. Тему, обратите внимание, что этот вопрос относится только к .NET compact framework. Это происходит на эмуляторах, которые поставляются с 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 (Балтика (ISO))
  • iso-8859-5 (кириллица (ISO))
  • iso-8859-7 (греческий (ISO))

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

Спасибо!

Andreas

Ответы [ 5 ]

15 голосов
/ 30 декабря 2008

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

System.Text.Encoding.GetEncoding(1252)
7 голосов
/ 30 декабря 2008

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

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

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

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

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

4 голосов
/ 08 июля 2014

Я знаю это немного позже, но я сделал реализацию для .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;
        }
    }
}
0 голосов
/ 10 ноября 2017

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

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

//Please follow the steps: 

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

//The code is:

    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);
    }
0 голосов
/ 30 декабря 2008

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

...