ASCIIEncoding в Windows Phone 7 - PullRequest
       14

ASCIIEncoding в Windows Phone 7

19 голосов
/ 26 октября 2010

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

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

Есть предложения?

Ответы [ 6 ]

44 голосов
/ 26 октября 2010

Это легко реализовать самостоятельно, 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;
    }
4 голосов
/ 26 октября 2010

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

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

3 голосов
/ 16 августа 2012

У меня есть приложение Silverlight, которое записывает файлы CSV, которые должны быть закодированы в ASCII (использование UTF-8 приводит к неправильному отображению символов с акцентом при открытии файлов в Excel).У меня нет класса 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;
    }
}
1 голос
/ 12 сентября 2015

Я начал с ответа @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[].

1 голос
/ 21 августа 2013

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

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

Uri.EscapeDataString(yourString);

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

0 голосов
/ 26 октября 2010

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

...