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))
では、ドイツ語、フランス語、スペイン語のサポートよりも、ギリシャ語のサポートの方が重要なのでしょうか。誰かがこれに光を当てることができますか?
ありがとう!
アンドレアス
エンコーディング文字列として「windows-1252」を使用しようとします。 ウィキペディアによると 、Windows-1252はISO-8859-1のスーパーセットです。
System.Text.Encoding.GetEncoding(1252)
このMSDNの記事 は言う:
.NET Compact Frameworkは、Unicode(BEおよびLE)、UTF8、UTF7、およびASCIIのすべてのデバイスで文字エンコードをサポートします。
コードページエンコーディングのサポートは制限されており、エンコーディングがデバイスのオペレーティングシステムによって認識されている場合に限ります。
必要なエンコーディングがデバイスで使用できない場合、.NET CompactFrameworkはPlatformNotSupportedExceptionをスローします。
ISOエンコーディングのすべて(または少なくとも多く)はコードページエンコーディングであり、「限定サポート」ルールに該当すると思います。 UTF8は、おそらく代替としての最善の策です。
少し後でわかりますが、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;
}
}
}
8859-1がサポートされていないのは奇妙なことですが、UTF-8には8859-1文字(およびそれ以上)のすべてを表す機能があるため、UTF-だけを使用できない理由があります。代わりに8?それは私たちが社内で行っていることであり、私は今日、ほぼ同じ問題に対処しました。 UTF-8を使用することのプラス面は、変更を加えたり、西部の言語に重みを加えたりすることなく、極東およびキリル文字の言語をサポートできることです。
誰かが次のような例外(.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);
}