ASCIIEncoding В Windows Phone 7

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

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

Любые предложения?

Ответ 1

Легко реализовать себя, 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;
    }

Ответ 2

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

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

Ответ 3

У меня есть приложение 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;
    }
}

Ответ 4

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

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

Uri.EscapeDataString(yourString);

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

Ответ 5

Я начал с ответа @Hans Passant, и я переписал его с Linq:

/// <summary>
/// Gets an encoding for the ASCII (7-bit) character set.
/// </summary>
/// <see cref="http://stackoverflow.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[].

Ответ 6

В соответствии с этим форумом MS thread, Windows Phone 7 не поддерживает Encoding.ASCII.