Ответ 1
Я бы попытался использовать "windows-1252" в качестве строки кодировки. Согласно Википедии, Windows-1252 является надмножеством ISO-8859-1.
System.Text.Encoding.GetEncoding(1252)
См. тему, обратите внимание, что этот вопрос относится только к платформе .NET compact. Это происходит на эмуляторах, которые поставляются с Windows Mobile 6 Professional SDK, а также на моем английском HTC Touch Pro (все .NET CF 3.5). iso-8859-1 означает западноевропейский (ISO), который, вероятно, является самым важным кодированием помимо us-ascii (по крайней мере, когда число идет по количеству сообщений usenet).
Мне сложно понять, почему эта кодировка не поддерживается, а следующие поддерживаются (опять же на эмуляторах и на моем HTC):
Итак, поддержка греческого языка важнее, чем поддержка немецкого, французского и испанский? Может ли кто-нибудь пролить свет на это?
Спасибо!
Андреас
Я бы попытался использовать "windows-1252" в качестве строки кодировки. Согласно Википедии, Windows-1252 является надмножеством ISO-8859-1.
System.Text.Encoding.GetEncoding(1252)
В этой статье MSDN говорится:
Поддержка .NET Compact Framework кодировка символов на всех устройствах: Unicode (BE и LE), UTF8, UTF7 и ASCII.
Существует ограниченная поддержка кодовой страницы кодирования и только в том случае, если кодирование признанных операционной системой устройства.
.NET Compact Framework выдает PlatformNotSupportedException, если a требуемая кодировка недоступна в устройства.
Я считаю, что все (или, по крайней мере, многие) кодировки ISO кодируются кодовыми страницами и подпадают под правило ограниченной поддержки. UTF8, вероятно, лучший выбор в качестве замены.
Я знаю его немного позже, но я сделал реализацию для .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;
}
}
}
Вы пробовали использовать верхний регистр имени набора символов? Официальная регистрация не включает нижестоящее имя, которое вы предоставили (что не объясняет, почему оно принимает версии с нижним регистром другого 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
Нечетно, что 8859-1 не поддерживается, но при этом UTF-8 имеет возможность представлять все 8859-1 символов (и более), поэтому есть причина, по которой вы не можете просто вместо этого использовать UTF-8? Это то, что мы делаем внутренне, и я только что затронул почти этот же вопрос сегодня. Положительная сторона использования UTF-8 заключается в том, что вы получаете поддержку для языков на востоке и кириллице без внесения изменений и без добавления веса на западные языки.
Если кто-то получает исключение (.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);
}