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
,