请参阅主题,请注意,此问题仅适用于.NET compact 框架。这种情况发生在Windows Mobile 6 Professional SDK附带的模拟器以及我的英文HTC Touch Pro(所有.NET CF 3.5)上。 iso-8859-1代表西欧(ISO),这可能是除了us-ascii之外最重要的编码(至少当用户网帖的数量时)。
我很难理解为什么不支持这种编码,而支持以下版本(同样在模拟器和我的HTC上):
所以,支持说希腊语比支持德语,法语更重要 和西班牙语?任何人都可以对此有所了解吗?
谢谢!
安德烈亚斯
答案 0 :(得分:15)
我会尝试使用“windows-1252”作为编码字符串。 According to Wikipedia,Windows-1252是ISO-8859-1的超集。
System.Text.Encoding.GetEncoding(1252)
答案 1 :(得分:6)
.NET Compact Framework支持 所有设备上的字符编码: Unicode(BE和LE),UTF8,UTF7和 ASCII。
对代码页的支持有限 编码,仅在编码时 被操作系统认可 设备。
.NET Compact Framework引发了一个问题 如果是a,则为PlatformNotSupportedException 所需的编码不可用 设备。
我认为所有(或至少很多)ISO编码都是代码页编码,属于“有限支持”规则。作为替代品,UTF8可能是您最好的选择。
答案 2 :(得分:3)
我稍后知道它但是我为ISO-8859-1的编码.net cf做了一个实现,我希望这可以帮助:
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;
}
}
}
答案 3 :(得分:0)
奇怪的是,8859-1不受支持,但是说,UTF-8确实能够代表所有8859-1个字符(以及更多),所以有理由你不能使用UTF-8代替?这就是我们内部所做的事情,今天我刚刚处理了同样的问题。使用UTF-8的另一方面是,您可以获得对远东和西里尔语言的支持而无需进行修改,也不会增加西方语言的重量。
答案 4 :(得分:0)
如果有人获得异常(.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);
}