ASCIIEncoding в Windows Phone 7

Есть ли способ использовать ASCIIEncoding в Windows Phone 7?

Если я не делаю что-то не так Encoding.ASCII не существует, и мне нужно это для C# -> шифрования PHP (так как PHP использует только ASCII в шифровании SHA1).

Какие-либо предложения?

6 ответов

Решение

Это легко реализовать самостоятельно, Unicode никогда не путался с кодами ASCII:

    public static byte[] StringToAscii(string s) {
        byte[] retval = new byte[s.Length];
        for (int ix = 0; ix < s.Length; ++ix) {
            char ch = s[ix];
            if (ch <= 0x7f) retval[ix] = (byte)ch;
            else retval[ix] = (byte)'?';
        }
        return retval;
    }

Не вижу каких-либо деталей в вашем вопросе, это может быть не в порядке. Вы правы. Silverlight не поддерживает кодировку ASCII.

Однако я подозреваю, что на самом деле UTF8 будет делать то, что вам нужно. Следует иметь в виду, что последовательность однобайтовых символов только ASCII и тот же набор символов, закодированных как UTF-8, идентичны. То есть полный набор символов ASCII дословно повторяется первыми 128 однобайтовыми кодовыми точками в UTF-8.

У меня есть приложение Silverlight, которое записывает файлы CSV, которые должны быть закодированы в ASCII (использование UTF-8 приводит к неправильному отображению символов с акцентом при открытии файлов в Excel).

Поскольку Silverlight не имеет класса Encoding.ASCII, я реализовал его следующим образом. Это работает для меня, надеюсь, что это полезно и для вас:

/// <summary>
/// Silverlight doesn't have an ASCII encoder, so here is one:
/// </summary>
public class AsciiEncoding : System.Text.Encoding
{
    public override int GetMaxByteCount(int charCount)
    {
        return charCount;
    }
    public override int GetMaxCharCount(int byteCount)
    {
        return byteCount;
    }
    public override int GetByteCount(char[] chars, int index, int count)
    {
        return count;
    }
    public override byte[] GetBytes(char[] chars)
    {
        return base.GetBytes(chars);
    }
    public override int GetCharCount(byte[] bytes)
    {
        return bytes.Length;
    }
    public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex)
    {
        for (int i = 0; i < charCount; i++)
        {
            bytes[byteIndex + i] = (byte)chars[charIndex + i];
        }
        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)
    {
        for (int i = 0; i < byteCount; i++)
        {
            chars[charIndex + i] = (char)bytes[byteIndex + i];
        }
        return byteCount;
    }
}

У меня была похожая проблема с использованием Xamarin (Mono) для Android, где я использую Portable Class Library, и они не поддерживают Econding.ASCII.

Вместо этого, единственное рабочее решение (кроме как делать это вручную) это

Uri.EscapeDataString(yourString);

Смотрите этот ответ, который предоставляет дополнительную информацию.

Я начал с ответа @Hans Passant и переписал его с помощью Linq:

/// <summary>
/// Gets an encoding for the ASCII (7-bit) character set.
/// </summary>
/// <see cref="http://stackru.com/a/4022893/1248177"/>
/// <param name="s">A character set.</param>
/// <returns>An encoding for the ASCII (7-bit) character set.</returns>
public static byte[] StringToAscii(string s)
{
    return (from char c in s select (byte)((c <= 0x7f) ? c : '?')).ToArray();
}

Вы можете удалить звонок ToArray() и вернуть IEnumerable<byte> вместо byte[],

Согласно этой ветке форума MS, Windows Phone 7 не поддерживает Encoding.ASCII,

Другие вопросы по тегам