ASCIIEncoding en Windows Phone 7

¿Hay alguna manera de utilizar ASCIIEncoding en Windows Phone 7?

A menos que esté haciendo algo mal Encoding.ASCII no existe y lo estoy necesitando para el cifrado C # -> PHP (ya que PHP solo usa ASCII en el cifrado SHA1).

¿Alguna sugerencia?

Es fácil de implementar usted mismo, Unicode nunca se molestó con los códigos 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; } 

Al no ver ningún detalle en su pregunta, esto podría desviarse. Tiene razón Silverlight no admite la encoding ASCII.

Sin embargo, sospecho que, de hecho, UTF8 hará lo que necesita. Vale la pena tener en cuenta que una secuencia de caracteres solo ASCII de byte único y el mismo conjunto de caracteres codificados como UTF-8 son idénticos. Ese es el conjunto de caracteres ASCII completo que se repite al pie de la letra por los primeros 128 puntos de código de un solo byte en UTF-8.

Tengo una aplicación de Silverlight que escribe archivos CSV, que tienen que estar codificados en ASCII (usar UTF-8 hace que los caracteres acentuados aparezcan mal cuando abre los archivos en Excel).

Como Silverlight no tiene una clase Encoding.ASCII , implementé uno de la siguiente manera. Funciona para mí, espero que sea útil para usted también:

 ///  /// Silverlight doesn't have an ASCII encoder, so here is one: ///  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; } } 

Tuve un problema similar con Xamarin (Mono) para Android en el que estoy usando Portable Class Library y no son compatibles con Econding.ASCII.

En cambio, la única solución de trabajo (excepto hacerlo manualmente) es esta

 Uri.EscapeDataString(yourString); 

Vea esta respuesta que proporciona información adicional.

Empecé con la respuesta de @Hans Passant y la reescribí con Linq:

 ///  /// Gets an encoding for the ASCII (7-bit) character set. ///  ///  /// A character set. /// An encoding for the ASCII (7-bit) character set. public static byte[] StringToAscii(string s) { return (from char c in s select (byte)((c <= 0x7f) ? c : '?')).ToArray(); } 

Es posible que desee eliminar la llamada a ToArray() y devolver un IEnumerable lugar de byte[] .

De acuerdo con este hilo del foro MS, Windows Phone 7 no es compatible con Encoding.ASCII .