lördag 14 maj 2011

Normalisering av Unicode

Det förträffliga programmet iconv stöder inte konvertering mellan olika normaliseringsformer, såsom (det också förträffliga programmet) convmv gör.

Det jag vill göra är att konvertera en text från unicode normaliseringsform D (mac os x) till normaliseringsform C (resten av världen:-). Det lättaste är att öppna filen i en texteditor och ta spara som, men det här är något jag ska göra i ett script så jag vill ha ett ickeinteraktivt program.

Lite undersökning av möjligheterna i perl pekar i riktningen Normalize. Perl är hyfsat väldefinierat vad gäller teckenkodning till skillnad från php som är besvärligt eftersom det inte brytt sig om teckenkodning förrän på senare tid. Tyvärr får jag inte Normalize att fungera som avsett!

Som tur är gav mig källkoden till convmv (som är skrivet i perl) en bra hint i en kommentar i texten. Vid närmare läsning visar det sig att det är lite si och så med buggigheten i perl vad gäller dessa funktioner. Eftersom jag kör lite olika perlversioner här och var tröttnar jag och vänder mig till php istället.
Såhär ser det ut på mac os x (med macports version av php, efter att ha installerat php5-intl via macports) (reservation för att vissa tecken äts upp av bloggeditorn)
#!/opt/local/bin/php
$fp = fopen('php://stdin', 'r');
while($str=fgets($fp)) {
echo Normalizer::normalize( $str, Normalizer::FORM_C );
}
?>

Anledningen till att jag håller på med det här är att jag håller på att utarbeta ett system för att synkronisera bildorganiseringsprogram mellan flera datorer. Mac använder normaliseringsform D så det blir problem när filnamn inte stämmer.

Inga kommentarer: