আমি নিজেকে পিএইচপি স্ক্রিপ্ট তৈরি করেছি built আমি ভেবেছিলাম আমি ইভেন্টে এটি ভাগ করে নেব অন্য কেউ একই ধরণের সমস্যাটি শেষ করে। এটি আমার এবং আমার প্রয়োজনীয় এনকোডিংগুলির জন্য কাজ করে (আপনার এনকোডিংস অ্যারে প্রসারিত করতে হতে পারে)।
স্ক্রিপ্টটি MIME এনকোডযুক্ত ফাইলের নামগুলি নির্দিষ্ট ডিরেক্টরি কাঠামোর মধ্যে পুনরাবৃত্তভাবে UTF-8 এ রূপান্তর করে।
এটি সম্পূর্ণ নিখুঁত ফলাফল দেয় না: বেশ কয়েকটি বিশেষ অক্ষর রয়েছে যা দ্বিগুণ রূপান্তরিত হয়, না হয় না। আমি যতদূর দেখতে পাচ্ছি, এটি আইএমএপি রফতানিকারীর দোষ বা ই-মেলের ভিতরেই ভুল এনকোডিং তথ্য।
mb_decode_mimeheader()
পুরো জিনিস হৃদয় হয়।
পাবলিক ডোমেইনে প্রকাশিত; কোনও ওয়্যারেন্টি নেই পিএইচপি 5.2 প্রয়োজন।
এটি উভয় সিএলআই এবং ওয়েবের মাধ্যমে চলতে হবে; আমি এটি ব্রাউজারে পরীক্ষা করেছি।
আপনার ডেটাতে স্ক্রিপ্টগুলি চলার আগে ব্যাকআপগুলি তৈরি করুন।
<?php
/* Directory to parse */
$dir = "D:/IMAP";
/* Extensions to parse. Leave empty for none */
$extensions = array("eml");
/* Set to true to actually run the renaming */
define ("GO", true);
/* No need to change past this point */
/* Output content type header if not in CLI */
if (strtolower(php_sapi_name()) != "CLI")
header("Content-type: text/plain; charset=utf-8");
$FixNames = new FixEmlNames($dir, $extensions);
$FixNames->fixAll();
class FixEmlNames
{
/* List of possible encodings here */
private $encodings = array("iso-8859-1", "iso-8859-15", "windows-1252", "utf-8");
/* Encoding Prefix. The exporter exports e.g. =_iso-8859-1_ with underscores
instead of question marks */
private $encoding_prefix = "=_";
/* Encoding postfix */
private $encoding_postfix = "_";
/* Temporary storage for files */
private $files;
/* Array of file extensions to process. Leave empty to parse all files and directories */
private $extensions = array();
/* Count of renamed files */
private $count = 0;
/* Count of failed renames */
private $failed = 0;
/* Count of skipped renames */
private $skipped = 0;
/* Transform forbidden characters in host OS */
private $transform_characters = array(":" => "_", "?" => "_", ">" => "_");
function __construct($dir, $extensions = array("eml"))
{
$this->files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
$this->extensions = $extensions;
}
function fixAll()
{
echo "Starting....\n";
while($this->files->valid())
{
if (!$this->files->isDot())
{
$path = $this->files->key();
$ext = pathinfo($path, PATHINFO_EXTENSION);
if ((count($this->extensions) == 0 ) or (in_array($ext, $this->extensions)))
$this->renameOne($path);
}
$this->files->next();
}
echo "Done. ";
/* Show stats */
$status = array();
if ($this->count > 0) $status[] = $this->count." OK";
if ($this->failed > 0) $status[] = $this->failed." failed";
if ($this->skipped > 0) $status[] = $this->skipped." skipped";
echo implode(", ", $status);
}
function renameOne($fullPath)
{
$filename = pathinfo($fullPath, PATHINFO_BASENAME);
$is_mime = false;
// See whether file name is MIME encoded or not
foreach ($this->encodings as $encoding)
{ if (stristr($filename, $this->encoding_prefix.$encoding.$this->encoding_postfix))
$is_mime = true;
}
// No MIME encoding? Skip.
if (!$is_mime)
{
# uncomment to see skipped files
# echo "Skipped: $filename\n";
$this->skipped++;
return true;
}
mb_internal_encoding("UTF-8");
$filename = str_replace("_", "?", $filename); // Question marks were converted to underscores
$filename = mb_decode_mimeheader($filename);
$filename = str_replace("?", "_", $filename);
// Remove forbidden characters
$filename = strtr($filename, $this->transform_characters);
// Rename
if (constant("GO") == true)
{
// We catch the error manually
$old = error_reporting(0);
$success = rename($fullPath, realpath(dirname($fullPath)).DIRECTORY_SEPARATOR.$filename);
error_reporting($old);
if ($success)
{
echo "OK: $filename\n";
$this->count++;
return true;
}
else
{
$error = error_get_last();
$message = $error["message"];
$this->failed++;
echo "Failed renaming $fullPath. Error message: ".$message."\n";
return false;
}
}
else
{
$this->count++;
echo "Simulation: $filename\n";
return true;
}
}
}