Use Cases
Database Migration
Migrate MySQL Latin1 to UTF-8
use Ducks\Component\EncodingRepair\CharsetHelper;
// Read data from old Latin1 database
$pdo = new PDO('mysql:host=localhost;dbname=olddb;charset=latin1', 'user', 'pass');
$stmt = $pdo->query("SELECT * FROM users");
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Convert all data to UTF-8
foreach ($users as &$user) {
$user = CharsetHelper::toUtf8($user, CharsetHelper::ENCODING_ISO);
}
// Insert into new UTF-8 database
$newPdo = new PDO('mysql:host=localhost;dbname=newdb;charset=utf8mb4', 'user', 'pass');
$insert = $newPdo->prepare("INSERT INTO users (id, name, email) VALUES (?, ?, ?)");
foreach ($users as $user) {
$insert->execute([$user['id'], $user['name'], $user['email']]);
}
CSV File Processing
Import CSV with Unknown Encoding
use Ducks\Component\EncodingRepair\CharsetHelper;
function importCsv(string $filename): array
{
$content = file_get_contents($filename);
// Auto-detect encoding
$encoding = CharsetHelper::detect($content);
echo "Detected encoding: {$encoding}\n";
// Convert to UTF-8
$utf8Content = CharsetHelper::toCharset(
$content,
CharsetHelper::ENCODING_UTF8,
$encoding
);
// Parse CSV
$lines = str_getcsv($utf8Content, "\n");
$data = array_map(fn($line) => str_getcsv($line), $lines);
return $data;
}
Web Scraping
Scrape Website with Auto-Detection
use Ducks\Component\EncodingRepair\CharsetHelper;
function scrapeWebsite(string $url): string
{
$html = file_get_contents($url);
// Try to detect from meta tag
if (preg_match('/<meta[^>]+charset=["\']?([^"\'>\\s]+)/i', $html, $matches)) {
$encoding = strtoupper($matches[1]);
} else {
// Auto-detect
$encoding = CharsetHelper::detect($html);
}
// Convert to UTF-8
return CharsetHelper::toCharset($html, CharsetHelper::ENCODING_UTF8, $encoding);
}
API Integration
REST API with Encoding Safety
use Ducks\Component\EncodingRepair\CharsetHelper;
class ApiController
{
public function handleRequest(array $data): string
{
// Ensure all input is UTF-8
$data = CharsetHelper::toUtf8($data, CharsetHelper::WINDOWS_1252);
// Process data
$result = $this->processData($data);
// Safe JSON encoding
return CharsetHelper::safeJsonEncode($result, JSON_PRETTY_PRINT);
}
public function parseResponse(string $json): array
{
// Safe JSON decoding with encoding repair
return CharsetHelper::safeJsonDecode($json, true);
}
}
Legacy System Integration
Fix Double-Encoded Data
use Ducks\Component\EncodingRepair\CharsetHelper;
// Fix double-encoded data from old system
$legacyData = $oldSystem->getData();
// Repair corruption
$clean = CharsetHelper::repair(
$legacyData,
CharsetHelper::ENCODING_UTF8,
CharsetHelper::ENCODING_ISO
);
// Process clean data
processData($clean);
Framework Integration
Laravel
use Ducks\Component\EncodingRepair\CharsetHelper;
use Illuminate\Support\ServiceProvider;
class CharsetServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->singleton('charset', function () {
return new class {
public function toUtf8($data, string $from = 'CP1252')
{
return CharsetHelper::toUtf8($data, $from);
}
public function repair($data)
{
return CharsetHelper::repair($data);
}
};
});
}
}
// Usage in controller
class UserController extends Controller
{
public function import(Request $request)
{
$data = app('charset')->toUtf8($request->all());
User::create($data);
}
}
Symfony
use Ducks\Component\EncodingRepair\CharsetHelper;
use Symfony\Component\HttpFoundation\JsonResponse;
class ApiController extends AbstractController
{
public function create(Request $request): JsonResponse
{
$data = json_decode($request->getContent(), true);
$utf8Data = CharsetHelper::toUtf8($data);
// Process...
return new JsonResponse(
CharsetHelper::safeJsonEncode($result)
);
}
}
WordPress
use Ducks\Component\EncodingRepair\CharsetHelper;
add_filter('the_content', function ($content) {
return CharsetHelper::repair($content);
});
add_action('save_post', function ($post_id) {
$post = get_post($post_id);
$fixed = CharsetHelper::repair($post->post_content);
if ($fixed !== $post->post_content) {
wp_update_post([
'ID' => $post_id,
'post_content' => $fixed
]);
}
});
Next Steps