Domanda

stavo scrivendo un CLI-Tool per Mac OS X (10.5 e versioni successive), che ha a che fare con gli argomenti della riga di comando che sono molto probabilmente contengono caratteri non ASCII.

Per ulteriori elaborazioni, posso convertire questi argomenti utilizzando + [NSString stringWithCString: codifica:].

Il mio problema è che non riuscivo a trovare buone informazioni su come determinare la codifica dei caratteri utilizzata dal guscio in cui ha detto cli-strumento è in esecuzione in.
Quello che mi si avvicinò con una soluzione è il seguente:

NSDictionary *environment = [[NSProcessInfo processInfo] environment];
NSString *ianaName = [[environment objectForKey:@"LANG"] pathExtension];
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(
  CFStringConvertIANACharSetNameToEncoding( (CFStringRef)ianaName ) );

NSString *someArgument = [NSString stringWithCString:argv[someIndex] encoding:encoding];

trovo che un po 'grezza, tuttavia -? Che mi fa pensare che ho perso qualcosa ovvio ... ma cosa

C'è un modo più sano / pulitore di ottenere sostanzialmente lo stesso?

Grazie in anticipo

D

È stato utile?

Soluzione 3

Va bene, si scopre non sembra esserci nessuno!

Come Yuji sottolineato, la codifica di fondo di nomi di file è UTF-8, non importa quale. Pertanto, uno necessario per gestire due scenari :

  1. Gli argomenti che vengono digitato, carattere per carattere, da parte dell'utente.
  2. Argomenti che sono scheda completata o l'uscita di comandi come ls, in quanto non convertono i caratteri.

Il secondo caso è semplicemente coperta dalla assunzione di UTF-8.

Il primo caso, però, è problematico:

  • In Mac OS 10.6, $ LANG contiene l'IANA-nome della codifica usata come de_DE.IANA_NAME.
  • Prima di Snow Leopard, questo non è il caso per set di caratteri diversi da UTF-8!

non ho la prova ogni charset mi venisse in mente, ma nessuno di quelli europei sono stati inclusi. Invece, $ LANG solo era la lingua-locale (de_DE nel mio caso)!

Poiché i risultati di +[NSString stringWithCString:encoding:] chiamare con una codifica non corretta sono indefiniti , non si può tranquillamente supporre che restituisca nil in quel caso * ( se, ad esempio. esso è ASCII-solo, potrebbe funzionare perfettamente bene!).

Che cosa aggiunge al caos generale è che $LANG non è guarateed per essere in giro, comunque: c'è una casella di controllo nelle preferenze di Terminal.app, che consente a un utente di $LANG non insieme a tutti (non parlano di X11.app che non sembra per gestire qualsiasi ingresso non ASCII ...).

Quindi, ciò che resta:

  1. Controlla presenza di $LANG. Se non è impostata, Goto: 4
  2. Verificare se $LANG contiene informazioni sulla codifica. In caso contrario, Goto: 4
  3. !
  4. Verificare se la codifica si trova lì è UTF-8. Se si tratta di Goto: 6, altro ...
  5. Se argc è maggiore di 2 e [[NSString stringWithCString: argv[0] encoding: NSUTF8StringEncoding] isEqualToString: yourForceUTFArgumentFlag], stampa che si stanno costringendo UTF-8 ora e Goto 6. Se non:
  6. Si supponga che non sa nulla, emettere un avviso che l'utente deve impostare la codifica Terminal a UTF-8 e può prendere in considerazione il passaggio yourForceUTFArgumentFlag come primo argomento e exit () .
  7. Si supponga UTF-8 e fare quello che hai da ...

Suoni di merda? Ecco perché è, ma non riesco a pensare di qualsiasi Saner modo di farlo.


Un altro nota però: Se si utilizza UTF-8 come codifica, stringWithCString: codifica:. Ritorna nil ogni volta che incontra caratteri non-ASCII in un C-String che è non codifica UTF-8)

Altri suggerimenti

La risposta dipende da ciò che il non-asciiness proviene.

  1. In OS X, il LANG variabile d'ambiente fa non riflettere la scelta della lingua nella GUI. Pochissime persone imposteranno LANG nella riga di comando.
  2. La scelta del "codifica di sistema" alla GUI è memorizzato in ~/.CFUserTextEncoding, e può essere ottenuta con CFStringGetSystemEncoding, vedere questo Mela doc .
  3. Detto questo, "encoding di sistema" è raramente utilizzato se non in molto vecchi, software consapevole non Unicode. Qualsiasi programma sano di cacao utilizza solo Unicode e nient'altro.
  4. In particolare, il percorso del file a livello di cacao è sempre codificato in (una variante) UTF-8. Quindi, per ottenere un NSString da una stringa C, l'uso

     NSString*string=[NSString stirngWithCString:cString encoding:NSUTF8Encoding];
    

    e per ottenere un C-stringa per il percorso del file da un NSString, uso

     char*path=[string fileSystemRepresentation];
    

    Qui si raccomanda di non utilizzare solo [string UTF8String], a causa della sottigliezza, vedere questo Mela doc .

  5. Quindi, vi consiglio di non interessa la codifica e solo supporre UTF-8.

  6. Detto questo, ci potrebbe essere un numero molto piccolo di persone che mette LANG sulla riga di comando, e si potrebbe desiderare di prendersi cura di loro. Allora, quello che hai fatto è l'unica cosa che posso venire con.

Non puoi semplicemente usare [[NSProcessInfo processInfo] arguments]?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top