Простая задача не завершилась простым решением, как ни странно. В сети можно найти много вопросов, но нет простых ответов. Казалось бы, в The Bat! предусмотрен экспорт адресной книги во что угодно. На практике ни один из доступных форматов не будет «как есть» адекватно принят программой Outlook Express.
Наиболее гладко всё происходит с vCard, но если воспользоваться им, «Николаевич» вдруг превратится в «Никола евич» и аналогично — незапланированные пробелы будут выявляться то там, то тут. К тому же, если адресная книга большая, вы быстро устанете в Outlook-е подтверждать импорт каждого контакта (хотя виндузятникам и не привыкать по сто раз нажимать «Да»).
Другие форматы — другие проблемы. Если вы читаете эту статью, значит, сами, скорее всего, уже в курсе. Надёжные, проверенные временем форматы, даже такие, как LDIF, дают сбой, и вот вы уже разводите руками. Но давайте всё же рассмотрим, что происходит при экспорте-импорте через LDIF.
The Bat! всё делает правильно. Данные сохраняются в 7-битной кодировке ASCII, отделяются от заголовка символом «:». Кириллические символы, как и все другие, выпадающие из диапазона ASCII, пишутся в кодировке BASE64 и отделяются от заголовка цепочкой символов «::». Беда лишь в том, что The Bat! пишет всё в UTF-8, а Outlook Express с локализацией даже не заморачивается: если у вас русскоязычная Windows, будет считать, что Outlook ждёт от нас кодировку CP1251 внутри контейнера BASE64. Отсюда несостыковка формата.
Вот готовый текст PHP-скрипта, который читает файл input.ldif, преобразует его и сохраняет в output.ldif:
Для запуска под Windows сохраните скрипт в файл, например, 1.php, в ту же папку добавьте php.exe и php5ts.dll — этого будет достаточно. Собственно запуск: php.exe 1.php
Преобразованный output.ldif прекрасно импортируется в Outlook Express.
К сожалению, не удалось избежать хвостовых пробелов, которые умышленно добавляются к данным. Они незаметны, а если их отключить, будет добавляться случайный мусор. Я склонен винить в этом сам конвертор Outlook-а, но если кто-то сможет выяснить поточнее, то было бы совсем хорошо.
1. Описание формата LDIF в Википедии.
2. Страница загрузки интерпретатора PHP для Windows-платформы.
Наиболее гладко всё происходит с vCard, но если воспользоваться им, «Николаевич» вдруг превратится в «Никола евич» и аналогично — незапланированные пробелы будут выявляться то там, то тут. К тому же, если адресная книга большая, вы быстро устанете в Outlook-е подтверждать импорт каждого контакта (хотя виндузятникам и не привыкать по сто раз нажимать «Да»).
Другие форматы — другие проблемы. Если вы читаете эту статью, значит, сами, скорее всего, уже в курсе. Надёжные, проверенные временем форматы, даже такие, как LDIF, дают сбой, и вот вы уже разводите руками. Но давайте всё же рассмотрим, что происходит при экспорте-импорте через LDIF.
The Bat! всё делает правильно. Данные сохраняются в 7-битной кодировке ASCII, отделяются от заголовка символом «:». Кириллические символы, как и все другие, выпадающие из диапазона ASCII, пишутся в кодировке BASE64 и отделяются от заголовка цепочкой символов «::». Беда лишь в том, что The Bat! пишет всё в UTF-8, а Outlook Express с локализацией даже не заморачивается: если у вас русскоязычная Windows, будет считать, что Outlook ждёт от нас кодировку CP1251 внутри контейнера BASE64. Отсюда несостыковка формата.
Вот готовый текст PHP-скрипта, который читает файл input.ldif, преобразует его и сохраняет в output.ldif:
<?php $f=file('input.ldif'); $o=''; foreach ($f as $s) { $i0=strpos($s,'::'); if ($i0!==false) $o.=substr($s,0,$i0).':: '. base64_encode( iconv('utf-8','cp1251',base64_decode(trim(substr($s,$i0+2))) ).' ')."\n"; else $o.=rtrim($s)."\n"; } file_put_contents('output.ldif',$o);
Для запуска под Windows сохраните скрипт в файл, например, 1.php, в ту же папку добавьте php.exe и php5ts.dll — этого будет достаточно. Собственно запуск: php.exe 1.php
Преобразованный output.ldif прекрасно импортируется в Outlook Express.
К сожалению, не удалось избежать хвостовых пробелов, которые умышленно добавляются к данным. Они незаметны, а если их отключить, будет добавляться случайный мусор. Я склонен винить в этом сам конвертор Outlook-а, но если кто-то сможет выяснить поточнее, то было бы совсем хорошо.
Ссылки
1. Описание формата LDIF в Википедии.
2. Страница загрузки интерпретатора PHP для Windows-платформы.