Kom ihåg mig?

Hjälp med att konvertera strängar

Ämnesverktyg Visningsalternativ
Oläst 2008-01-26, 12:44 #1
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
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.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-26, 16:36 #2
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
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....
__________________
Full-stack developer, free for smaller assignments
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-26, 16:59 #3
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
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.
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-26, 17:40 #4
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
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.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-26, 17:59 #5
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
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.
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-01-27, 12:31 #6
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
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;

}

}
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 
Ämnesverktyg
Visningsalternativ

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 17:40.

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