Ладно, похоже, их нет!
Как указал Юджи, основная кодировка имен файлов - это UTF-8, несмотря ни на что. Следовательно, необходимо обработать два сценария :
- Аргументы, вводимые пользователем, символ за персонажем.
- Аргументы, которые завершаются табуляцией или вывод команд типа
ls
, так как они не преобразуют символы.
Второй случай просто охвачен предположением UTF-8.
Первый случай, однако, проблематичен:
- В Mac OS 10.6 $ LANG содержит IANA-имя используемой кодировки, например
de_DE.IANA_NAME
.
- До Snow Leopard это не так для кодировок, отличных от UTF-8!
Я не проверял каждый набор символов, который мог придумать, но ни один из европейских не был включен. Вместо этого только $ LANG был языковым языком (de_DE
в моем случае)!
Поскольку результаты вызова +[NSString stringWithCString:encoding:]
с неправильной кодировкой не определены , вы не можете с уверенностью предположить, что в этом случае он вернет nil
(если, например, это Только для ASCII, это может прекрасно работать!).
Что добавляет к общему беспорядку, так это то, что $LANG
не гарантируется , чтобы быть рядом, в любом случае: в настройках Terminal.app есть флажок, который позволяет пользователю вообще не устанавливать $LANG
(не говоря уже о X11.app, который, кажется, не обрабатывает входные данные не ASCII ...).
Так что же осталось:
- Проверка на наличие
$LANG
. Если он не установлен, перейдите к: 4!
- Проверьте, содержит ли
$LANG
информацию о кодировке. Если это не так, Goto: 4!
- Проверьте, существует ли кодировка UTF-8. Если это Гото: 6, иначе ...
- Если
argc
больше 2 и [[NSString stringWithCString: argv[0] encoding: NSUTF8StringEncoding] isEqualToString: yourForceUTFArgumentFlag]
, распечатайте, что вы сейчас принудительно используете UTF-8 и перейдите к 6. Если нет:
- Предположим, вы ничего не знаете, выдайте предупреждение о том, что ваш пользователь должен установить кодировку терминала в UTF-8 и может рассмотреть возможность передачи
yourForceUTFArgumentFlag
в качестве первого аргумента и exit () .
- Предположим, UTF-8 и делать то, что вы должны ...
Звучит дерьмово? Это потому, что это так, но я не могу придумать какой-либо разумный способ сделать это.
Еще одно замечание:
Если вы используете UTF-8 в качестве кодировки, stringWithCString: encoding: возвращает ноль всякий раз, когда встречается не-ASCII-символы в C-строке, которая не закодирована в UTF-8.)