web-dev-qa-db-ja.com

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(バルト海(ISO))
  • iso-8859-5(キリル文字(ISO))
  • iso-8859-7(ギリシャ語(ISO))

では、ドイツ語、フランス語、スペイン語のサポートよりも、ギリシャ語のサポートの方が重要なのでしょうか。誰かがこれに光を当てることができますか?

ありがとう!

アンドレアス

14
user49572

エンコーディング文字列として「windows-1252」を使用しようとします。 ウィキペディアによると 、Windows-1252はISO-8859-1のスーパーセットです。

System.Text.Encoding.GetEncoding(1252)
15
splattne

このMSDNの記事 は言う:

.NET Compact Frameworkは、Unicode(BEおよびLE)、UTF8、UTF7、およびASCIIのすべてのデバイスで文字エンコードをサポートします。

コードページエンコーディングのサポートは制限されており、エンコーディングがデバイスのオペレーティングシステムによって認識されている場合に限ります。

必要なエンコーディングがデバイスで使用できない場合、.NET CompactFrameworkはPlatformNotSupportedExceptionをスローします。

ISOエンコーディングのすべて(または少なくとも多く)はコードページエンコーディングであり、「限定サポート」ルールに該当すると思います。 UTF8は、おそらく代替としての最善の策です。

7
Otis

少し後でわかりますが、ISO-8859-1をエンコードする.netcfの実装を作成しました。これが役立つことを願っています。

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
hdkrus

8859-1がサポートされていないのは奇妙なことですが、UTF-8には8859-1文字(およびそれ以上)のすべてを表す機能があるため、UTF-だけを使用できない理由があります。代わりに8?それは私たちが社内で行っていることであり、私は今日、ほぼ同じ問題に対処しました。 UTF-8を使用することのプラス面は、変更を加えたり、西部の言語に重みを加えたりすることなく、極東およびキリル文字の言語をサポートできることです。

0
ctacke

誰かが次のような例外(.NETコンパクトフレームワーク)を取得している場合:

 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
Prasad KM