Mac OS XでCLIのキャラクターエンコードを取得するSANE(R)方法?
-
28-09-2019 - |
質問
私は、Mac OS X(10.5+)のCLI-Toolを書いていました。これは、ASCII以外の文字を含む可能性が非常に高いコマンドライン引数を扱わなければなりません。
さらに処理するために、 +[nsstring stringwithcstring:encoding:]を使用してこれらの引数を変換します。
私の問題は、Cli-Toolが実行されているシェルが使用するキャラクターエンコードを決定する方法に関する良い情報を見つけることができなかったことです。
解決策として私が思いついたのは、次のことです。
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];
しかし、私は少し粗雑だと思います - それは私が何か明白な何かを逃したと思うようになります...しかし何ですか?
本質的に同じことを達成するためのsaner/cleanerの方法はありますか?
前もって感謝します
d
解決 3
さて、それは何もないようです!
Yujiが指摘したように、ファイル名の根底にあるエンコードは、何があってもUTF-8です。したがって、1つは処理する必要がありました 2つのシナリオ:
- タイプされた引数、キャラクターのキャラクター、ユーザーによる引数。
- タブが完成した引数または次のようなコマンドの出力
ls
, 、キャラクターを変換しないため。
2番目のケースは、UTF-8の仮定によって単純にカバーされています。
ただし、最初のケースには問題があります。
- Mac OS 10.6には、$ Langには使用されているエンコードのiana-nameが含まれています。
de_DE.IANA_NAME
. - スノーヒョウの前に、 これはそうではありません にとって UTF-8以外の充電器!
私は考えられるすべてのチャーセットをテストしませんでしたが、ヨーロッパのものはどれも含まれていませんでした。代わりに、$ langのみが言語ロケールでした(de_DE
私の場合)!
呼び出しの結果以来 +[NSString stringWithCString:encoding:]
間違ったエンコーディングがあります 未定義です, 、あなたはそれが戻ると安全に想定することはできません nil
その場合*(たとえば、それはascii-onlyである場合、それは完全に正常に機能するかもしれません!)。
全体的な混乱に追加されるのはそれです $LANG
ガラートされていません とにかく周りにいること:Terminal.Appの設定には、ユーザーが設定しないことを可能にするチェックボックスがあります。 $LANG
まったく(X11.APPについて話すのではなく、ASCII以外の入力を処理しないようです...)。
だから残っているもの:
- の存在を確認してください
$LANG
. 。設定されていない場合は、goto:4! - かどうかを確認してください
$LANG
エンコーディングに関する情報が含まれています。そうでない場合、goto:4! - EncodingがUTF-8があるかどうかを確認してください。それがgotoの場合:6、他の...
- もしも
argc
2より大きい[[NSString stringWithCString: argv[0] encoding: NSUTF8StringEncoding] isEqualToString: yourForceUTFArgumentFlag]
, 、あなたが今UTF-8を強制していることを印刷してください。 - 何も知らないと仮定し、ユーザーが端末エンコードをUTF-8に設定し、合格を検討する場合があるという警告を発します
yourForceUTFArgumentFlag
最初の議論として 出口(). - UTF-8を仮定し、あなたがしなければならないことをしてください...
くだらない音?それはそうだからですが、私は何も考えられません ソナー それをする方法。
さらに1つの注意事項:UTF-8をエンコーディングとして使用している場合、StringWithCString:エンコード:nilをnilを返します。 いいえ UTF-8でエンコード。)
他のヒント
答えは、非アスピさの由来に依存します。
- OS Xでは、環境変数
LANG
します いいえ GUIの言語の選択を反映してください。設定する人はほとんどいませんLANG
コマンドラインで。 - GUIでの「システムエンコード」の選択はに保存されます
~/.CFUserTextEncoding
, 、およびによって取得できますCFStringGetSystemEncoding
, 、これを参照してください Apple Doc. - とはいえ、この「システムエンコード」はそうです ほとんど使われません 非常に古い非ユニコード認識ソフトウェアを除きます。 SANE Cocoaプログラムは、Unicodeだけを使用しています。
特に、ココアのレベルのファイルパスは、常に(の)UTF-8でエンコードされます。だから、
NSString
C文字列から、使用しますNSString*string=[NSString stirngWithCString:cString encoding:NSUTF8Encoding];
からのファイルパスのcストリングを取得するには
NSString
, 、 使用するchar*path=[string fileSystemRepresentation];
ここでは、ただ使用しないことをお勧めします
[string UTF8String]
, 、微妙なため、これを参照してください Apple Doc.したがって、エンコードを気にせず、UTF-8を想定することをお勧めします。
- とはいえ、設定する人が非常に少ないかもしれません
LANG
コマンドラインで、あなたはそれらの世話をしたいかもしれません。それから、あなたがしたことは私が思いつくことができる唯一のことです。
使用できません [[NSProcessInfo processInfo] arguments]
?