Czy w C # mogę przekonwertować wartość ciągu na literał ciągu, tak jak widziałbym to w kodzie? Chciałbym zastąpić tabulatory, znaki nowej linii itp. Sekwencjami ucieczki.
Jeśli ten kod:
Console.WriteLine(someString);
produkuje:
Hello
World!
Chcę ten kod:
Console.WriteLine(ToLiteral(someString));
produkować:
\tHello\r\n\tWorld!\r\n
@"..."
literały dosłowne ( )?Co z Regex.Escape (String) ?
źródło
Hello World?
wHello World\?
, ale jest to niepoprawny literał łańcuchowy.EDYCJA: Bardziej uporządkowane podejście, obejmujące wszystkie sekwencje specjalne dla
string
s ichar
s.Nie zastępuje znaków Unicode ich dosłownym odpowiednikiem. Nie gotuje też jajek.
źródło
@"[\a\b\f\n\r\t\v\\""/]"
i dodanom_replaceDict.Add("/", @"\/");
dlaJSON
.próbować:
źródło
źródło
W pełni działająca implementacja, w tym unikanie znaków niedrukowalnych Unicode i ASCII. Nie wstawia znaków „+”, takich jak odpowiedź Hallgrima .
źródło
Char.GetUnicodeCategory(c) == UnicodeCategory.Control
aby zdecydować, czy uciec, bo ludzie, którzy nie mówią ASCII, nie będą bardzo szczęśliwi.input = input ?? string.Empty;
jako pierwszy wiersz metody, więc mogłem przekazaćnull
i wrócić""
zamiast wyjątku odniesienia zerowego.'
i teraz masz to, co Python daje Ci od razu po wyjęciu z pudełkarepr(a_string)
:).Odpowiedź Hallgrima jest doskonała, ale dodatki „+”, nowa linia i wcięcia były dla mnie przełomowe. Prostym rozwiązaniem jest:
źródło
return literal
aby była bardziej czytelna:literal = literal.Replace("\\r\\n", "\\r\\n\"+\r\n\"");
literal = literal.Replace("/", @"\/");
dlaJSON
funkcjonalności.Oto mała poprawka dla odpowiedzi Smilediver, nie uniknie ona wszystkich znaków bez ASCII, ale tylko one są naprawdę potrzebne.
źródło
Interesujące pytanie.
Jeśli nie możesz znaleźć lepszej metody, zawsze możesz ją wymienić.
Jeśli zdecydujesz się na to, możesz użyć tej listy sekwencji ucieczki C # :
Ta lista znajduje się w C # Często zadawane pytania Jakie sekwencje specjalne znaków są dostępne?
źródło
Jest na to metoda w pakiecie Microsoft.CodeAnalysis.CSharp Roslyn w nugecie:
Oczywiście nie istniało to w momencie pierwotnego pytania, ale może pomóc osobom, które trafią tutaj z Google.
źródło
Jeśli konwencje JSON są wystarczające dla nieskalowanych ciągów znaków, które chcesz uciec i już używasz
Newtonsoft.Json
w swoim projekcie (ma dość duży narzut), możesz użyć tego pakietu w następujący sposób:źródło
źródło
Moja próba dodania ToVerbatim do zaakceptowanej odpowiedzi Hallgrima powyżej:
źródło
Odpowiedź Hallgrima była doskonała. Oto drobna poprawka na wypadek, gdybyś musiał przeanalizować dodatkowe znaki białych znaków i łamanie linii za pomocą wyrażenia regularnego ac #. Potrzebowałem tego w przypadku zserializowanej wartości Jsona do wstawiania do arkuszy Google i miałem problemy, ponieważ kod wstawiał tabulatory, +, spacje itp.
źródło
Przesyłam własną implementację, która obsługuje
null
wartości i powinna być bardziej wydajna ze względu na użycie tablic wyszukiwania tablic, ręczną konwersję szesnastkową i unikanieswitch
instrukcji.źródło
Kod:
Wynik:
Czy to jest to, czego chcesz?
źródło