【问题标题】:Windows Phone 8 getting string from base64 iso 8859-2 encoded textWindows Phone 8 从 base64 iso 8859-2 编码文本中获取字符串
【发布时间】:2013-11-22 17:38:35
【问题描述】:

我有 base64 编码的字符串,结果是 iso-8859-2 编码,我需要从中获取字符串。

我正在使用 Windows Phone 8 C#/XAML .NET 4.5 应用程序。

我现在正在做的是:

    private string decodeXML(string xml)
    {
        byte[] data = Convert.FromBase64String(xml); //I decode the base64 data

        string decoded = Encoding.UTF8.GetString(data, 0, data.Length); 
        //and here get a string from it using UTF8, problem being the data are in "iso-8859-2"
        return decoded;
    }

所以我尝试了:

   private string decodeXML(string xml)
    {
        byte[] data = Convert.FromBase64String(xml);
        string decoded = Encoding.GetEncoding("iso-8859-2").GetString(data, 0, data.Length); 
        return decoded;
    }

但我得到一个例外

System.ArgumentException was unhandled by user code
HResult=-2147024809
Message='iso-8859-2' is not a supported encoding name.
Parameter name: name
Source=mscorlib
ParamName=name
StackTrace:
   at System.Globalization.EncodingTable.internalGetCodePageFromName(String name)
   at System.Globalization.EncodingTable.GetCodePageFromName(String name)
   at System.Text.Encoding.GetEncoding(String name)
   .....and the rest of the stack trace...

我应该如何从中获取保留特殊字符的字符串? (使用哪种方式从中获取字符串?)

【问题讨论】:

  • 您可以尝试使用this table手动进行转换

标签: c# windows-phone-8 character-encoding


【解决方案1】:

这是从 ISO 8859-2String 的手动转换代码。 未测试:

    private readonly ushort[] iso8859_2 = {
        0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 
        0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, 0x00B0, 0x0105, 0x02DB, 0x0142, 
        0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 
        0x017E, 0x017C, 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 
        0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, 0x0110, 0x0143, 
        0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 
        0x00DC, 0x00DD, 0x0162, 0x00DF, 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 
        0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, 
        0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 
        0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 };

    private string decodeXML(string xml)
    {
        byte[] data = Convert.FromBase64String(xml);
        char[] decoded = new char[data.Length];

        for (int i = 0; i < data.Length; i++)
            if (data[i] < 128)
                decoded[i] = (char)data[i];
            else if (data[i] < 0xA0)
                decoded[i] = '\0';
            else
                decoded[i] = (char)iso8859_2[data[i] - 0xA0];

        return new string(decoded);
    }

【讨论】:

  • 你是救生员。像魅力一样工作。 :)
【解决方案2】:

Encoding.GetEncoding("iso-8859-2") 对我有用,至少在 .NET 4.5 中。 Encoding.GetEncoding("latin2") 也是如此。他们的代码页是 28592,所以Encoding.GetEncoding(28592) 给出了相同的结果。 windows codepage 1250 也差不多(还是完全一样?),可以试试Encoding.GetEncoding(1250) 或者Encoding.GetEncoding("windows-1250")

更新:哦,是的,WP8... 见:'windows-1255' is not a supported encoding name。所以基本上它可能根本不受支持,您应该根据编码规范将字节手动映射到字符。没那么难,创建一个大小为 256 的 char 数组,array[i] 应该是该编码中字节 i 对应的字符。

【讨论】:

  • 谢谢,得出了同样的结论。
猜你喜欢
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2011-07-26
  • 2011-04-07
  • 1970-01-01
  • 2011-01-08
  • 2014-10-01
  • 1970-01-01
相关资源
最近更新 更多