2012-04-19 11 views
16

MODIFICA: L'output NSLog funziona bene nel simulatore, ma non funziona quando è collegato a un dispositivo reale. E sembra che sia un bug - http://openradar.appspot.com/11148883. Accade anche che sia collegato al LLDB, il passaggio da Xcode a GDB risolve il problema. O è possibile l'AppCode di JetBrain, che funziona bene con il LLDB.NSLog restituisce caratteri unicode come dati inutili durante il debug su iPhone


Ho un sacco di stringhe Unicode nella domanda, e se provo a uscita una di queste stringhe usando qualcosa come NSLog (@ "% @", astring) poi tutti i caratteri ASCII nel stringa verrà stampato bene, ma tutte le lettere in cirillico sarà incasinato, così invece di

newLocation: coordinate:60.019584,30.284954 'Удельная' 

sto ottenendo:

newLocation: coordinate:60.019584,30.284954 '–ü–æ–∫–ª–æ–Ω–Ω–æ–≥–æ—Ä—Å–∫–∞—è' 

E questo è abbastanza difficile fare il debug con quel tipo di output. E dal momento che quell'app è indirizzata al mercato russo, non posso solo cambiare le impostazioni internazionali e utilizzare le stringhe in inglese.

Quindi mi chiedo se esiste un modo per far funzionare NSLog con caratteri unicode? E sto cercando solo una qualche soluzione one-liner, so che ci sono alcuni modi per scrivere una mezza pagina di codice e produrre caratteri unicode, ma sto cercando qualcosa di più breve. Idealmente sto cercando un metodo di NSString che faccia funzionare tutto. per esempio.

NSLog(@"%@", [aString someThingThatMakesUnicodeWorkWithXcodeConsole]); 
+1

Sei sicuro che la tua aString stia memorizzando correttamente la risposta? Da quello che hai postato credo che aString non abbia archiviato correttamente la risposta, quindi sì, quando lo si stampa con NSLog, fallirà. Stampa caratteri greci con NSLog tutto il tempo. Come stai memorizzando la risposta a aString? – Lefteris

+1

Da dove vengono le stringhe? Li leggi da un file? Quando sono all'interno del codice dovrebbe funzionare. Ho provato: NSString * s = @ "Удельная"; NSLog (@ "% @", s); e ha funzionato bene. –

+0

Questi dati provengono da un file, ma una stringa letterale non ha funzionato neanche per me. Ma sembra che io abbia trovato la fonte - funziona bene nel simulatore, ma restituisce spazzatura quando è connesso all'iPhone, quindi probabilmente qualcosa è semplicemente sbagliato con alcune impostazioni. Grazie. –

risposta

3

Per quanto ne so, è rilevante per NSLog() e LLDB su alcune versioni Xcode.Prova con una di queste soluzioni:

  • Controlla il log in Xcode Organizer >> Dispositivi >> il tuo dispositivo >> Console.
  • Utilizzare GDB come debugger anziché LLDB se si utilizza quest'ultimo. Questo può essere modificato dalle opzioni dello schema. Si prega di fare riferimento ai passaggi nel commento di "cocos2d man" di seguito.
  • Aggiornamento a Xcode 4.3.2. Alcuni dicono che ha risolto questo problema, ma non l'ho mai confermato.
+0

Grazie, il passaggio a GDB è stato effettivamente risolto. Passare alla 4.3.2 non aiuta perché lo sto già usando. –

+0

Comunque è la soluzione corretta, ma non riesco a trovare queste opzioni nell'organizzatore e dopo una lunga ricerca nel nuovo Xcode ho scoperto che possiamo cambiare il debugger dello schema usando i seguenti passi: 1-clic sullo schema corrente (risiedono accanto al pulsante stop e play, oltre alla modalità corrente di test come iphone-simulator ...) 2-scegli l'opzione "Modifica schema" 3-Apri il rubinetto "info" 4-Vai al terzo drop -down list che ha nominato "debugger" 5-cambia il valore da LLDB a GDB chiudi la finestra e costruisci ed esegui di nuovo :) – Adel

+0

@ cocos2dman Scusa per equivoci ... Le 1, 2, 3 sopra sono tre soluzioni ma non 3 passaggi per una soluzione. Sto cambiando i numeri con i proiettili. – Hailei

0

provare a mettere piace NSLog(@"%@", aString);

EDIT:

è possibile convertirlo in stringa UTF8. Questo potrebbe farti passare.

NSString *str = [aString UTF8String]; 

Spero che questo aiuti.

+0

certo che l'ho fatto, l'ho scritto male nella domanda, grazie comunque. –

+0

@dsokurenko Vedi la parte di modifica. – Akshay

+0

L'ho visto, ma sfortunatamente non fa il trucco, emette comunque la spazzatura insensata. –

0

Provare a convertirlo in stringa UTF8.

NSString *str = [aString UTF8String] 
NSLog(@"%@", str); 

Spero che questo aiuti.

+0

No, non aggiusta l'uscita. –

+0

Assicurati di aver posto @ in nslog – Ranga

+4

In realtà @ "% @" non funzionerà affatto perché l'output di UTFString è una c-string, e con il corretto formato% "% s" produrrà la stessa spazzatura come la stringa originale. –

4

Sì, ovviamente è possibile creare una stringa che conterrà e stamperà lettere cirilliche. Quando stavo imparando Objective-C, ho avuto lo stesso problema all'inizio (sto anche lavorando con parole russe e cose del genere). Così soluzione è quella di convertire la stringa in altro formato in questo modo:

NSString *string = [NSString stringWithCString:"Привет, как дела?" encoding:4]; 
NSLog(@"%@", string); 

o

NSString *string = [NSString stringWithUTF8String:"Этот вариант короче!"]; 
NSLog(@"%@", string); 

Spero che ti aiuta!

P.S Significa che è necessario creare le stringhe come stringhe C-Style e impostare il loro parametro di codifica su 4 (UTF-8). È possibile visualizzare l'elenco di parametri disponibili nella documentazione su NSStringEncoding in NSString.

+0

Grazie per la risposta, ma succede che nel simulatore le stringhe di russo funzionano bene di default, e tutte le soluzioni proposte, inclusa quella tua, funzionano anche. Ma quando collego Xcode al dispositivo reale, le lettere cirilliche vengono emesse come spazzatura. –

+0

@dsokurenko Purtroppo non posso verificarlo. Che cos'è la localizzazione sul tuo dispositivo? Sono davvero non so qual è il problema, ma proverò a capirlo. –

+0

@dsokurenko Tutto dovrebbe essere visualizzato correttamente, perché stringa nella codifica destra (UTF-8 è solo uno che funziona correttamente con il cirillico). –

0

Prova questo. Per me funziona.

NSLog(@"%@", [NSString stringWithCString:[[places description] cStringUsingEncoding:NSASCIIStringEncoding] encoding:NSNonLossyASCIIStringEncoding]);