WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Hjälp med att konvertera strängar (https://www.wn.se/forum/showthread.php?t=26633)

Magnus_A 2008-01-26 12:44

Hej,
Sitter och klurar med att konvertera strängar från olika teckenkodningar till en och samma.
Har strängar som är kodade i UTF-8, ISO-8859-1 samt MacRoman.
Dessa ska konverteras till en och samma kodning, lämpligen UTF-8.
Problemet är att jag inte vet - och inte kan veta - på förhand vilken kodning strängen har. Det är alltså inte fråga om POST-data.
Miljön är php.
mb_string-funktionerna stöder inte MacRoman, och iconv saknar möjlighet att avgöra vilken kodning som jag har för handen.
Så problemet kan smalnas av till att utreda exakt vilken kodning som jag har i teckensträngen.
Alternativt kan man tänka sig en bred översättningstabell som fixar alla kodningarna på en och samma gång.

tartareandesire 2008-01-26 16:36

utf8_encode() kan du ju köra på ISO-8859-1 men det vet du väl förmodligen redan... Misstänker att du får göra egna funktioner för de andra två och sedan köra strängen genom alla tre funktionerna....

martine 2008-01-26 16:59

Egentligen är det en omöjlig uppgift eftersom i sig inte finns något som avslöjar teckenkodningen. I korta strängar finns det ju eventuellt ingenting alls som skiljer. Vad det gäller uft så kan man ofta lätt se det genom att man får samlingar av två-tre skräptecken när man ser det som iso. För att skilja mellan macroman och iso måste texten på något sätt vara kontextbaserad - handlar det om längre texter på svenska kan du ju leta efter förekomsten av ordet "är" exempelvis, 0x8A i macroman och 0xE4 i iso-8859-1. Du kan ju också försöka mappa så att inga stora bokstäver förekommer inuti ord.

Magnus_A 2008-01-26 17:40

Tack för svar. Det är korta strängar - EXIF och ITPC-data från bilder. Kan man testa förekomst av åäöÅÄÖéÈÜÜôÔ i respektive kodning och få ett entydigt svar på vilken kodning det handlar om?
UTF-8 kan jag skilja ut via mb_detect_charset men att skilja på iso-8859-1 och macroman är värre.

Kör jag iconv från ISO till UTF på en macroman-sträng och vice versa blir resultatet inte bra.

martine 2008-01-26 17:59

Optimalt är förstås om du hittar ett tecken som alltid är med i EXIF-filen men har ett annat nummer i MacRoman och ISO. Annars är det väl värt att leta efter förekomsten av 0xe4, 0xe5 och 0xf6 (iso) eller 0x8a, 0x8c och 0x9a (macroman) i strängarna (koderna för åäö)

/[a-z]+[\xe4\xe5\xf6][a-z]+/ för iso
/[a-z]+[\x8a\x8c\x9a][a-z]+/ för macroman
med preg_match exempelvis

Accenttecknen ligger tydligen generellt högre (i bit-ordning) i iso än i macroman - även av detta skulle man kunna göra något.

Edit: entydigt kan du aldrig veta eftersom du aldrig kan veta om man inte kan veta om någon menat att skriva "f^r" eller "för" - bitarna är exakt desamma - man får gå på sannolikhet.

Magnus_A 2008-01-27 12:31

Tack igen!
Gjorde så här:
Citat:

function konvertera_olika_tecken($string, $iso_chars= Array(
193 => 1,
196 => 1,
197 => 1,
201 => 1,
214 => 1,
220 => 1,
225 => 1,
228 => 1,
229 => 1,
233 => 1,
246 => 1,
252 => 1
), $mac_chars=Array(
128 => 1,
129 => 1,
131 => 1,
133 => 1,
134 => 1,
135 => 1,
138 => 1,
140 => 1,
142 => 1,
154 => 1,
159 => 1,
231 => 1
)){
// hittar igen följande bokstäver: åäöÅÄÖüÜáÁéÉ
// för att fixa med andra bokstäver skicka med variabler $[mac/iso]_chars= count_chars(iconv('utf-8','[macintosh/ISO-8859-1]','[alla tecken som ska kännas igen]'),1);

if (iconv('utf-8','utf-8',$string) ==$string ) return $string;

$chars=count_chars($string,1);

if(count(array_diff_key($chars,$mac_chars) )==0 ){
echo 'mac';
return iconv('macintosh','utf-8',$string);
}
elseif(count(array_diff_key($chars,$iso_chars) ) ==0 ){
echo 'iso';
return iconv('ISO-8859-1','utf-8',$string);
}
else{
return $string;

}

}



Alla tider är GMT +2. Klockan är nu 15:45.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson