2013-02-18 8 views
5

Piszę skrypt Pythona, który generuje kod C++ na podstawie danych.Jak uciec ciąg znaków dla wygenerowanego C++?

Mam zmienną Pythona string, która zawiera ciąg znaków, który może składać się z takich znaków jak " lub znaków nowej linii.

Jaki jest najlepszy sposób na uniknięcie tego ciągu do generowania kodu?

+1

Nie najlepiej to rozwiązać za pomocą silnika szablonów, takiego jak [jinja] (http://jinja.pocoo.org/docs/templates/), który może już unikać znaków; Wiem, że wcześniej robiłem coś podobnego podczas generowania kodu Java - zdaję sobie sprawę, że mogłem źle zinterpretować twoje pytanie. – sotapme

Odpowiedz

3

Sposób, w jaki korzystam, opiera się na obserwacji, że łańcuchy C++ w zasadzie stosują się do tych samych reguł dotyczących znaków i znaków, co łańcuch znaków JavaScript/JSON.

Python od wersji 2.6 ma wbudowaną bibliotekę JSON, która może serializować dane Python do JSON. W związku z tym, że kod jest przy założeniu, że nie potrzebujemy załączając cytaty, jak następuje:

import json 
string_for_printing = json.dumps(original_string).strip('"') 
+2

Z wyjątkiem sytuacji, gdy w ciągu znaków znajdują się znaki Unicode. Lub gdy kończy się cytatem. Również nie działa dla danych binarnych. Wywoływanie dowolnych danych dla C++ przy zachowaniu czytelności nie jest tak proste, jak się wydaje - ostatnio to robiłem, właśnie skończyłem przekształcanie każdego bajtu w formularz \ xNN. –

1

używam tego kodu, do tej pory bez problemów:

def string(s, encoding='ascii'): 
    if isinstance(s, unicode): 
     s = s.encode(encoding) 
    result = '' 
    for c in s: 
     if not (32 <= ord(c) < 127) or c in ('\\', '"'): 
     result += '\\%03o' % ord(c) 
     else: 
     result += c 
    return '"' + result + '"' 

Wykorzystuje ósemkowy ucieka, aby uniknąć wszystkie potencjalnie problematyczne postacie.