ASCIIEncoding In Windows Phone 7

C’è un modo per utilizzare ASCIIEncoding in Windows Phone 7?

A meno che non stia facendo qualcosa di sbagliato Encoding.ASCII non esiste e ne ho bisogno per C # -> crittografia PHP (dato che PHP usa solo ASCII nella crittografia SHA1).

Eventuali suggerimenti?

È facile da implementare, Unicode non ha mai combinato i codici 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; } 

Non vedendo davvero alcun dettaglio nella tua domanda questo potrebbe essere fuori strada. Hai ragione Silverlight non ha supporto per la codifica ASCII.

Tuttavia, sospetto che in realtà UTF8 farà ciò di cui hai bisogno. Vale la pena ricordare che una sequenza di caratteri ASCII a byte singolo e lo stesso set di caratteri codificati come UTF-8 sono identici. Questo è il completo set di caratteri ASCII ripetuto testualmente dai primi 128 punti di codice a byte singolo in UTF-8.

Ho un’app Silverlight che scrive file CSV, che devono essere codificati in ASCII (usando UTF-8, i caratteri accentati appaiono errati quando si aprono i file in Excel).

Poiché Silverlight non ha una class Encoding.ASCII , l’ho implementata come segue. Funziona per me, spero sia utile anche a te:

 ///  /// 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; } } 

Ho avuto problemi simili usando Xamarin (Mono) per Android, dove sto usando Portable Class Library e non supportano Econding.ASCII.

Invece, l’unica soluzione funzionante (tranne farlo manualmente) è questa

 Uri.EscapeDataString(yourString); 

Vedi questa risposta che fornisce informazioni aggiuntive.

Ho iniziato dalla risposta di @Hans Passant e l’ho riscritta 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(); } 

È ansible rimuovere la chiamata a ToArray() e restituire un IEnumerable anziché byte[] .

Secondo questo thread del forum MS, Windows Phone 7 non supporta Encoding.ASCII .