Преобразуйте строку Unicode в завершенную строку ASCII

Вы попробовали скрипач при использовании этого через IE, Вы смогли видеть трафик, который Silverlight вызывает, такой как, которые пересекают файлы политики, которые это ищет?

74
задан DavidRR 6 May 2016 в 13:28
поделиться

5 ответов

Это перемещается туда и обратно в формат \ uXXXX и обратно.

class Program {
    static void Main( string[] args ) {
        string unicodeString = "This function contains a unicode character pi (\u03a0)";

        Console.WriteLine( unicodeString );

        string encoded = EncodeNonAsciiCharacters(unicodeString);
        Console.WriteLine( encoded );

        string decoded = DecodeEncodedNonAsciiCharacters( encoded );
        Console.WriteLine( decoded );
    }

    static string EncodeNonAsciiCharacters( string value ) {
        StringBuilder sb = new StringBuilder();
        foreach( char c in value ) {
            if( c > 127 ) {
                // This character is too big for ASCII
                string encodedValue = "\\u" + ((int) c).ToString( "x4" );
                sb.Append( encodedValue );
            }
            else {
                sb.Append( c );
            }
        }
        return sb.ToString();
    }

    static string DecodeEncodedNonAsciiCharacters( string value ) {
        return Regex.Replace(
            value,
            @"\\u(?<Value>[a-zA-Z0-9]{4})",
            m => {
                return ((char) int.Parse( m.Groups["Value"].Value, NumberStyles.HexNumber )).ToString();
            } );
    }
}

Вывод:

Эта функция содержит символ Юникода pi (π)

Эта функция содержит символ Юникода pi (\ u03a0)

Эта функция содержит символ Юникода pi (π)

130
ответ дан 24 November 2019 в 11:55
поделиться
string StringFold(string input, Func<char, string> proc)
{
  return string.Concat(input.Select(proc).ToArray());
}

string FoldProc(char input)
{
  if (input >= 128)
  {
    return string.Format(@"\u{0:x4}", (int)input);
  }
  return input.ToString();
}

string EscapeToAscii(string input)
{
  return StringFold(input, FoldProc);
}
11
ответ дан 24 November 2019 в 11:55
поделиться
class Program
{
        static void Main(string[] args)
        {
            char[] originalString = "This string contains the unicode character Pi(π)".ToCharArray();
            StringBuilder asAscii = new StringBuilder(); // store final ascii string and Unicode points
            foreach (char c in originalString)
            {
                // test if char is ascii, otherwise convert to Unicode Code Point
                int cint = Convert.ToInt32(c);
                if (cint <= 127 && cint >= 0)
                    asAscii.Append(c);
                else
                    asAscii.Append(String.Format("\\u{0:x4} ", cint).Trim());
            }
            Console.WriteLine("Final string: {0}", asAscii);
            Console.ReadKey();
        }
}

Все символы, отличные от ASCII, преобразуются в представление их кодовой точки Unicode и добавляются к последней строке.

2
ответ дан 24 November 2019 в 11:55
поделиться

Вам необходимо использовать метод Convert () в классе Encoding :

  • Создайте объект Encoding , который представляет кодировку ASCII
  • Создайте объект Encoding , который представляет кодировку Unicode
  • Вызов Encoding.Convert () с исходной кодировкой, целевой кодировкой и строкой для кодирования

Здесь есть пример :

using System;
using System.Text;

namespace ConvertExample
{
   class ConvertExampleClass
   {
      static void Main()
      {
         string unicodeString = "This string contains the unicode character Pi(\u03a0)";

         // Create two different encodings.
         Encoding ascii = Encoding.ASCII;
         Encoding unicode = Encoding.Unicode;

         // Convert the string into a byte[].
         byte[] unicodeBytes = unicode.GetBytes(unicodeString);

         // Perform the conversion from one encoding to the other.
         byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);

         // Convert the new byte[] into a char[] and then into a string.
         // This is a slightly different approach to converting to illustrate
         // the use of GetCharCount/GetChars.
         char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
         ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
         string asciiString = new string(asciiChars);

         // Display the strings created before and after the conversion.
         Console.WriteLine("Original string: {0}", unicodeString);
         Console.WriteLine("Ascii converted string: {0}", asciiString);
      }
   }
}
0
ответ дан 24 November 2019 в 11:55
поделиться

Чтобы сохранить фактические кодовые точки Unicode, вы должны сначала декодировать кодовые единицы UTF-16 строки в кодовые единицы UTF-32 (которые в настоящее время совпадают с кодовыми точками Unicode). Используйте для этого System.Text.Encoding.UTF32.GetBytes () , а затем запишите полученные байты в StringBuilder по мере необходимости, то есть

static void Main(string[] args) 
{ 
    String originalString = "This string contains the unicode character Pi(π)"; 
    Byte[] bytes = Encoding.UTF32.GetBytes(originalString);
    StringBuilder asAscii = new StringBuilder();
    for (int idx = 0; idx < bytes.Length; idx += 4)
    { 
        uint codepoint = BitConverter.ToUInt32(bytes, idx);
        if (codepoint <= 127) 
            asAscii.Append(Convert.ToChar(codepoint)); 
        else 
            asAscii.AppendFormat("\\u{0:x4}", codepoint); 
    } 
    Console.WriteLine("Final string: {0}", asAscii); 
    Console.ReadKey(); 
}
0
ответ дан 24 November 2019 в 11:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: