Как стать автором
Обновить

Перенос кириллической адресной книги из The Bat! в Outlook Express

Простая задача не завершилась простым решением, как ни странно. В сети можно найти много вопросов, но нет простых ответов. Казалось бы, в 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:

<?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-платформы.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.