Есть ли способ использовать ASCIIEncoding в Windows Phone 7?
Если я делаю что-то не так, Encoding.ASCII
не существует, и мне это нужно для С# → PHP-шифрования (поскольку PHP использует только ASCII в шифровании SHA1).
Любые предложения?
Есть ли способ использовать ASCIIEncoding в Windows Phone 7?
Если я делаю что-то не так, Encoding.ASCII
не существует, и мне это нужно для С# → PHP-шифрования (поскольку PHP использует только ASCII в шифровании SHA1).
Любые предложения?
Легко реализовать себя, 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://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[]
.
В соответствии с этим форумом MS thread, Windows Phone 7 не поддерживает Encoding.ASCII
.