Вы не первый человек, который столкнется с этой проблемой с iconv
. Кто-то записал сценарий Perl для решения его.
iconv
не обрабатывает большие файлы хорошо. От glibc исходного кода, в iconv/iconv_prog.c
:
/* Since we have to deal with
arbitrary encodings we must read the whole text in a buffer and
process it in one step. */
Однако для Вашего особого случая, могло бы быть лучше записать Ваш собственный блок проверки допустимости UTF-8. Вы могли легко дистиллировать iconv -c -f utf8 -t utf8
вниз к маленькой программе C, с циклом, который звонит iconv(3)
. Так как UTF-8 является немодальным и самосинхронизация, можно обработать его в блоках.
#include
#include
#include
#include
#include
#define BUFSIZE 4096
/* Copy STDIN to STDOUT, omitting invalid UTF-8 sequences */
int main() {
char ib[BUFSIZE], ob[BUFSIZE], *ibp, *obp;
ssize_t bytes_read;
size_t iblen = 0, oblen;
unsigned long long total;
iconv_t cd;
if ((iconv_t)-1 == (cd = iconv_open("utf8", "utf8"))) {
perror("iconv_open");
return 2;
}
for (total = 0;
bytes_read = read(STDIN_FILENO, ib + iblen, sizeof(ib) - iblen);
total += bytes_read - iblen) {
if (-1 == bytes_read) { /* Handle read error */
perror("read");
return 1;
}
ibp = ib; iblen += bytes_read;
obp = ob; oblen = sizeof(ob);
if (-1 == iconv(cd, &ibp, &iblen, &obp, &oblen)) {
switch (errno) {
case EILSEQ: /* Invalid input multibyte sequence */
fprintf(stderr, "Invalid multibyte sequence at byte %llu\n",
1 + total + sizeof(ib) - iblen);
ibp++; iblen--; /* Skip the bad byte next time */
break;
case EINVAL: /* Incomplete input multibyte sequence */
break;
default:
perror("iconv");
return 2;
}
}
write(STDOUT_FILENO, ob, sizeof(ob) - oblen);
/* There are iblen bytes at the end of ib that follow an invalid UTF-8
sequence or are part of an incomplete UTF-8 sequence. Move them to
the beginning of ib. */
memmove(ib, ibp, iblen);
}
return iconv_close(cd);
}
Вы не собираетесь любить это немного лучше, чем ответ, который Вы имеете теперь (раскройте и повторно скройтесь), но определение legacyExchangeDN
из почтового ящика пользователя позволит "Имени Проверки" функционировать, даже если объект будет скрыт (так как в основном это - то, что "Имя Проверки" делает - разрешение псевдонима пользователя в legacyExchangeDN).
У моего пользователя "EAnderson" на моей тестовой буровой установке здесь есть legacyExchangeDN "/o=Home/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)/cn=Recipients/cn=EAnderson". Я проверяю, что почтовый ящик скрыт от списков адресов, не разрешит с именем псевдонима "EAnderson", но "Проверяют, что Имя" хорошо работает, и почтовый ящик открывается, когда я использую legacyExchangeDN. (Этот прием работал полностью назад, по крайней мере, к Exchange 5.5 и был приемом, который я буду использовать, чтобы показать людям кто, хотя они были "экспертами Exchange", что, возможно, они не знали все, которое они думали, что сделали... heh heh...),
Где Вы получаете legacyExchangeDN? Используя инструмент как ADSIEDIT позволит Вам видеть его, как будет любые другие инструменты, которые позволяют запросы "свободной формы" базы данных Active Directory.
После того как Вы знаете формат атрибутов legacyExchangeDN своих пользователей, можно, вероятно, сформулировать их из головы. Они стали намного более ужасными в обмен 2007, потому что у них есть ссылка на "/ou=Exchange Administrative Group (FYDIBOHF23SPDLT)" AG в них.
Раскройте его в GAL, настройте Outlook, повторно скройте его в GAL.