c # возвращает строку из sql 2005 - PullRequest
1 голос
/ 16 апреля 2009

Хорошо,

У меня есть строка в таблице SQL, как это

hello /r/n this is a test /r/n new line.

Когда я получаю эту строку, используя c # для текстового поля, используя многострочный текст, я ожидаю, что escape-символы будут символами новой строки.

Но это не так, и что происходит, я получаю линию точно так же, как и выше.

Кажется, что строка, возвращенная из таблицы, воспринимается как буквальная, но я хочу переводы строк!

Как мне заставить это работать?

Заранее спасибо ..

Ответы [ 6 ]

3 голосов
/ 16 апреля 2009

/ не является escape-символом, \ is. Что вам нужно, это:

привет \ r \ n это тест \ r \ n новой строки.

1 голос
/ 16 апреля 2009

Такие вещи, как "\ n" (кстати, не "/ n"), являются управляющими символами в языках программирования , а не по сути в тексте. (В частности, они зависят от языка программирования.)

Если хотите сделать

hello\r\nthis is a test\r\nnew line

формат как

hello
this is a test
new line

вам нужно будет выполнить синтаксический анализ самостоятельно, заменив "\ r" на возврат каретки, "\ n" на новую строку и т. Д., Обработав "\" как буквальный обратный слеш и т. Д. Обычно я обнаружил, что это простой парсер, который просто помнит, был ли предыдущий символ обратной косой чертой, достаточно ли это для большинства целей. Примерно так:

static string Unescape(string text)
{
    StringBuilder builder = new StringBuilder(text.Length);
    bool escaping = false;
    foreach (char c in text)
    {
        if (escaping)
        {
           // We're not handling \uxxxx etc
           escaping = false;
           switch(c)
           {
               case 'r': builder.Append('\r'); break;
               case 'n': builder.Append('\n'); break;
               case 't': builder.Append('\t'); break;
               case '\\': builder.Append('\\'); break;
               default:
                   throw new ArgumentException("Unhandled escape: " + c);
           }
        }
        else
        {
           if (c == '\\')
           {
               escaping = true;
           }
           else
           {
               builder.Append(c);
           }
        }
    }
    if (escaping)
    {
        throw new ArgumentException("Unterminated escape sequence");
    }
    return builder.ToString();
}

Существуют более эффективные способы сделать это (в основном, переход от обратной косой черты к обратной косой черте и добавление целых подстрок неэкранированного текста), но это просто.

0 голосов
/ 16 апреля 2009

Я думаю, что проблема в том, что строка, видимая пользователем, -

привет \ r \ n это тест \ r \ n новой строки.

в то время как код C # видит его как

"hello \\r\\n this is a test \\r\\n new line."

Гораздо более простым решением было бы следующее

s = Regex.Replace(s, @"\\\\", @"\");

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

0 голосов
/ 16 апреля 2009

Я не понимаю, почему в этом случае требуется Parser, учитывая, что речь идет о C #, и я предполагаю, что ОС - это 32-битная Windows, которая обрабатывает \r\n как символ NewLine.

У меня работает следующий простой код (приложение для Windows):

string s = "hello \r\n this is a test \r\n new line.";

// Set Multiline to True.
textBox1.Multiline = true;

// Expand the height of the textbox to be able to view the full text.
textBox1.Height = 100;
textBox1.Text = s;

Текстовое поле показывает текст как:

hello
 this is a test 
 new line.
0 голосов
/ 16 апреля 2009

Похоже, вам нужно использовать System.Web.HttpUtility.HtmlDecode для строки перед тем, как поместить ее в TextBox.

 textBox.Value = HttpUtility.HtmlDecode(myString);
0 голосов
/ 16 апреля 2009

У меня была похожая проблема с моей базой данных SQLite на днях. Пользователи могут вводить многострочный текст в текстовое поле, и когда он вставляется в базу данных, он выглядит следующим образом:

"This is \r\n a multiline test"

Это выходило из System.Data.SQLite как:

"This is \\r\\n a multiline test"

Я использовал:

String.Replace("\\r","\r").Replace("\\n","\n") 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...