Sane (r) modo per ottenere di codifica dei caratteri della CLI in Mac OS X?
-
28-09-2019 - |
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
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 :
- Gli argomenti che vengono digitato, carattere per carattere, da parte dell'utente.
- 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:
- Controlla presenza di
$LANG
. Se non è impostata, Goto: 4 - Verificare se
$LANG
contiene informazioni sulla codifica. In caso contrario, Goto: 4 !
- Verificare se la codifica si trova lì è UTF-8. Se si tratta di Goto: 6, altro ...
- 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: - 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 () . - 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.
- In OS X, il
LANG
variabile d'ambiente fa non riflettere la scelta della lingua nella GUI. Pochissime persone imposterannoLANG
nella riga di comando. - La scelta del "codifica di sistema" alla GUI è memorizzato in
~/.CFUserTextEncoding
, e può essere ottenuta conCFStringGetSystemEncoding
, vedere questo Mela doc . - 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.
-
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'usoNSString*string=[NSString stirngWithCString:cString encoding:NSUTF8Encoding];
e per ottenere un C-stringa per il percorso del file da un
NSString
, usochar*path=[string fileSystemRepresentation];
Qui si raccomanda di non utilizzare solo
[string UTF8String]
, a causa della sottigliezza, vedere questo Mela doc . -
Quindi, vi consiglio di non interessa la codifica e solo supporre UTF-8.
- 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]
?