2017-02-09 1 views
0

Ich habe versucht, an example whitespace remover von hier auf SO zu übersetzen, um in einem C++ - CLI-Projekt zu laufen. Im Folgenden sieht so weit fein wie Intellisense betrifft:Warum erhalte ich den Fehler C3851 (ein Universal-Charaktername kann kein Zeichen im Basiszeichensatz angeben)?

static String^ TrimAllWithInplaceCharArray(String^ str) 
{ 
    unsigned int len = str->Length; 
    array<wchar_t, 1>^ src = str->ToCharArray(); 
    int dstIdx = 0; 
    for (unsigned int i = 0; i < len; i++) { 
     wchar_t ch = src[i]; 
     switch (ch) { 
      case L'\u0020': case L'\u00A0': case L'\u1680': case L'\u2000': case L'\u2001': 
      case L'\u2002': case L'\u2003': case L'\u2004': case L'\u2005': case L'\u2006': 
      case L'\u2007': case L'\u2008': case L'\u2009': case L'\u200A': case L'\u202F': 
      case L'\u205F': case L'\u3000': case L'\u2028': case L'\u2029': case L'\u0009': 
      case L'\u000A': case L'\u000B': case L'\u000C': case L'\u000D': case L'\u0085': 
       continue; 
      default: 
       src[dstIdx++] = ch; 
       break; 
     } 
    } 
    return gcnew String(src, 0, dstIdx); 
} 

... aber lässt sich nicht kompilieren:

error C3851 : '\u0020' : a universal - character - name cannot designate a character in the basic character set 
error C3850 : '\u0009' : a universal - character - name specifies an invalid character 
error C3850 : '\u000A' : a universal - character - name specifies an invalid character 
error C2196 : case value '63' already used 
error C3850 : '\u000B' : a universal - character - name specifies an invalid character 
error C2196 : case value '63' already used 
error C3850 : '\u000C' : a universal - character - name specifies an invalid character 
error C2196 : case value '63' already used 
error C3850 : '\u000D' : a universal - character - name specifies an invalid character 
error C2196 : case value '63' already used 
error C3850 : '\u0085' : a universal - character - name specifies an invalid character 
error C2196 : case value '63' already used 

Am I miss-repräsentieren einen Datentyp oder die wörtliche Werte in irgendeiner Weise?

+1

Schwer zu erraten, kompiliert sauber. Es ist die Art von Fehler, den Sie bekommen würden, wenn der Compiler 'L \ u0020' statt' L \ u0020'' sieht. Oder eine andere Art von Unicode-Zeichen, die wie ein Apostroph aussieht. Es erkennt es also nicht mehr als ein Literal. Typische Kopie/Pasta Unfall BTW. Verwenden Sie einen Hex-Viewer, um die Quelldatei anzusehen. –

+0

Wie wäre es mit dem Versuch, die "00" zu entfernen? Verwenden Sie zum Beispiel '\ u20' anstelle von '\ u0020'. Nur eine schnelle Schätzung. – Sunsetquest

Antwort

0

Prüfen Sie, ob die folgenden Werke ...

static String^ TrimAllWithInplaceCharArray(String^ str) 
{ 
    unsigned int len = str->Length; 
    array<wchar_t, 1>^ src = str->ToCharArray(); 
    int dstIdx = 0; 
    for (unsigned int i = 0; i < len; i++) { 
     wchar_t ch = src[i]; 
     switch (ch) { 
     case L'\x20': case L'\xA0': case L'\u1680': case L'\u2000': case L'\u2001': 
     case L'\u2002': case L'\u2003': case L'\u2004': case L'\u2005': case L'\u2006': 
     case L'\u2007': case L'\u2008': case L'\u2009': case L'\u200A': case L'\u202F': 
     case L'\u205F': case L'\u3000': case L'\u2028': case L'\u2029': case L'\x09': 
     case L'\x0A': case L'\x0B': case L'\x0C': case L'\x0D': case L'\x85': 
      continue; 
     default: 
      src[dstIdx++] = ch; 
      break; 
     } 
    } 
    return gcnew String(src, 0, dstIdx); 
} 

diese here gefunden ...

„Sie nicht verwenden können - u0022, weil Sie einen universellen Charakter Namen nicht verwenden können, die ein Zeichen bezeichnet im grundlegenden Zeichensatz . "

+0

Das scheint tatsächlich zu funktionieren. Danke :) –

+1

Einige nützlichere Hintergrund auf Zeichenkettenliteralen hier: http://stackoverflow.com/questions/10220401/c-string-literals-escape-character –

Verwandte Themen