Заменить escape-последовательности Юникода в строке [duplicate]

На этот вопрос уже есть ответ здесь:

Строка символов Юникода 3 ответа

У нас есть один текстовый файл, который имеет следующий текст

"\u5b89\u5fbd\u5b5f\u5143"

Когда мы читаем файл, зараженный в c # .net, он показывает как

"\\u5b89\\u5fbd\\u5b5f\\u5143"

Наш метод декодирования

public string Decoder(string value)
        {
            Encoding enc = new UTF8Encoding();
            byte[] bytes = enc.GetBytes(value);
           return enc.GetString(bytes);
        }

Когда я передаю жесткое значение кода

string Output=Decoder("\u5b89\u5fbd\u5b5f\u5143");

это работает хорошо, но когда мы используем значение переменной, это время не работает.

Когда мы используем строку, что мы получаем из текстового файла

  value=(text file containt)
  string Output=Decoder(value);

Возвращает неверный вывод.

Пожалуйста, помогите мне решить проблему.

Ответы на вопрос(6)

это освобождает любой символ esapces от строки ввода

Regex.Unescape(value);

UTFEncoding (или любая другая кодировка) не будет переводить escape-последовательности, такие как\u5b89 в соответствующий символ.

Причина, по которой это работает, когда вы передаете строковую константу, заключается в том, что компилятор C # интерпретирует escape-последовательности и переводит их в соответствующий символ перед вызовом декодера (фактически даже до того, как программа будет выполнена ...).

Вы должны написать код, который распознает escape-последовательности и преобразует их в соответствующие символы.

Решение Вопроса

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

а потом:

string data = Decoder(File.ReadAllText("test.txt"));
 PrateekSaluja16 мар. 2012 г., 15:21
Я использую 3.5 Framework
 Darin Dimitrov16 мар. 2012 г., 15:16
Какую версию .NET вы используете?NumberStyles перечисление определяется вSystem.Globalization пространство имен, поэтому убедитесь, что вы ссылались на него.
 PrateekSaluja16 мар. 2012 г., 15:14
Прежде всего, спасибо за ваш ответ, когда я использую этот код, я получаю ошибку компиляции. 1 Невозможно преобразовать лямбда-выражение в тип 'string', поскольку оно не является ошибкой делегата. 2 Имя NumberStyles не существует в текущем контексте.
 PrateekSaluja16 мар. 2012 г., 15:20
Спасибо @ Darin. Я проголосовал за тебя. Если ты сможешь устранить ошибку компиляции, это будет здорово для нас.
 PrateekSaluja16 мар. 2012 г., 15:15
Подскажите, пожалуйста, какую ошибку я совершил?

"\u5b89\u5fbd\u5b5f\u5143" Вы получаете именно то, что читаете. Отладчик экранирует ваши строки перед их отображением. Двойная обратная косая черта в строке на самом деле является одиночной обратной косой чертой, которую удалось избежать.

Когда вы передаете жестко закодированное значение, вы на самом деле не передаете то, что видите на экране. Вы передаете четыре символа Unicode, так как строка C # не экранируется компилятором.

Дарин уже опубликовал способ удаления символов Unicode из файла, поэтому я не буду его повторять.

что это даст вам некоторое представление.

   string str = "ivandro\u0020";
    str = str.Trim();

Если вы попытаетесь напечатать строку, вы заметите, что пространство, которое было удалено

ваш файл содержит дословную строку

\u5b89\u5fbd\u5b5f\u5143

в ASCII, а не в строке, представленной этими четырьмя кодовыми точками Unicode в некоторой заданной кодировке?

Как это случилось, я просто написал некоторый код на C #, который может анализировать строки в этом формате дляпроект парсера JSON - вот вариант, который обрабатывает только экранирование \ uXXXX:

private static string ReadSlashedString(TextReader reader) {
    var sb = new StringBuilder(32);
    bool q = false;
    while (true) {
        int chrR = reader.Read();

        if (chrR == -1) break;
        var chr = (char) chrR;

        if (!q) {
            if (chr == '\\') {
                q = true;
                continue;
            }
            sb.Append(chr);
        }
        else {
            switch (chr) {
                case 'u':
                case 'U':
                    var hexb = new char[4];
                    reader.Read(hexb, 0, 4);
                    chr = (char) Convert.ToInt32(new string(hexb), 16);
                    sb.Append(chr);
                    break;
                default:
                    throw new Exception("Invalid backslash escape (\\ + charcode " + (int) chr + ")");
            }
            q = false;
        }
    }
    return sb.ToString();
}

и вы могли бы использовать его как

var str = ReadSlashedString(new StringReader("\\u5b89\\u5fbd\\u5b5f\\u5143"));

(или используяStreamReader читать из файла).

Надеюсь это поможет!

РЕДАКТИРОВАТЬ: @ Darin Ответ с использованием регулярных выражений Димитрова, вероятно, быстрее, но у меня был этот код под рукой. :)

 PrabhuPrakash23 нояб. 2017 г., 15:34
спасибо большое .. я так боролся в последний день. теперь я понял .. еще раз спасибо
 PrateekSaluja16 мар. 2012 г., 15:19
благодаря его работе, я попробовал код Дарина, но получил некоторые проблемы с компиляцией. Любой путь большое спасибо за этот код.

Ваш ответ на вопрос