Sida 1 av 2
Hitta "replacement character" i text
Postat: 12 nov 2009, 21:08
av ubot
Jag behöver en metod för att kontrollera om en text innehåller en "replacement character", dvs ett frågetecken i en svart ruta. Jag behöver veta om texten har blivit omkodad i rätt teckenkodning och om texten ser bra ut. Ibland så stämmer inte teckenkodningen och då blir vissa tecken (framförallt å, ä och ö) utbytta mot ett frågetecken i en svart ruta. Hur "söker" jag igenom en text för att kontrollera om det finns någon "replacement character" i texten?
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 12:18
av Lars
Det känns som att frågan är felställd. De där frågetecknen är förmodligen inte lagrade i filen utan de visas när ett tecken inte finns med i det typsnitt du använder.
Vad är det för filer och var kommer de ifrån? Har de helt okänt teckenkodning från början?
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 17:32
av ubot
Lars skrev:Det känns som att frågan är felställd. De där frågetecknen är förmodligen inte lagrade i filen utan de visas när ett tecken inte finns med i det typsnitt du använder.
Vad är det för filer och var kommer de ifrån? Har de helt okänt teckenkodning från början?
Jag vill göra det här:
1. Om teckenkodningen är UTF-8, låt teckenkodningen vara!
2. Om teckenkodningen är ISO-8859-1, omkoda till UTF-8!
Problemet: Ibland omkodas UTF-8 till UTF-8 pga att jag får fel info från mb_detect_encoding i PHP vilket sätter in "replacement characters" istället för tex å, ä och ö. Jag vill alltså göra en sista kontroll av texten för att se att alla tecken verkligen är riktiga tecken och inte en "replacement character".
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 17:43
av Lars
Aha, det är alltså
U+FFFD du menar? Jag visste inte att det fanns ett särskilt tecken för det.
Jag är ingen expert på PHP men det borde väl vara så svårt att söka efter ett visst tecken i en fil.
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 17:56
av Konservburk
ubot skrev:Jag vill göra det här:
1. Om teckenkodningen är UTF-8, låt teckenkodningen vara!
2. Om teckenkodningen är ISO-8859-1, omkoda till UTF-8!
Testa detta:
Kod: Markera allt
if (!iconv("UTF-8", "UTF-8", $text))
{
$text = iconv("ISO-8859-1", "UTF-8", $text);
}
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 18:58
av ubot
Konservburk skrev:ubot skrev:Jag vill göra det här:
1. Om teckenkodningen är UTF-8, låt teckenkodningen vara!
2. Om teckenkodningen är ISO-8859-1, omkoda till UTF-8!
Testa detta:
Kod: Markera allt
if (!iconv("UTF-8", "UTF-8", $text))
{
$text = iconv("ISO-8859-1", "UTF-8", $text);
}
Är det bash eller PHP kod?
Om jag har text från några olika sajter, hur konverterar jag till UTF-8 (om det inte redan är det) och dubbelkollar så att det inte finns några "replacement characters" i texten efter:
ISO-8859-1:
http://www.expressen.se/Nyheter/1.17791 ... nfor-ratta
UTF-8:
http://www.aftonbladet.se/nyheter/article6121080.ab
UTF-8 (fel!):
http://blogg.aftonbladet.se/1/2009/11/l ... u-pa-natet
Sista är lurig. Den fintar PHPs mb_detect_encoding genom att säga att den är UTF-8, vilket inte stämmer! Om jag skriver ut sidans titel direkt i Terminalen så får jag "replacement characters" i texten, men inte om jag först konverterar från ISO-8859-1 till UTF-8. Då ser texten bra ut! Dvs texten är inte UTF-8 utan ISO-8859-1 från början! Jag använder am version av Ubuntu så antar att Terminalen har UTF-8 som teckenkodning.
Nu vet jag inte varför, men det här skriptet ser inte ut att fungera riktigt. Det går inte att konvertera till eller från ISO-8859-1 säger Terminalen när jag kör det. Aja, annars så är det iaf å, ä och ö som blir "replacement characters" i en text som ser bra ut i konvertering från ISO-8859-1 till UTF-8, men sidan texten kommer ifrån säger UTF-8 och där mb_detect_encoding i PHP också säger UTF-8. Om jag konverterar med PHP från ISO-8859-1 till UTF-8 så ser texten bra ut, om jag "släpper igenom" texten oförändrad (och litar på att det är UTF-8) så innehåller texten massa "replacement characters".
Hur ska jag veta om jag ska släppa igenom texten oförändrad (dvs låta UTF-8 vara UTF-8) eller konvertera från ISO-8859-1 till UTF-8 för att texten "egentligen" är ISO-8859-1 men webbsidans kod mm "ljuger" om att teckenkodningen är UTF-8! Jag måste ju veta om texten ska konverteras till UTF-8 eller inte! Hur ska jag göra?
Det fungerade inte att lägga texten mellan code-taggar så jag klistrar in den rakt av:
#!/bin/bash
url=http\:\/\/blogg.aftonbladet.se/1/2009/11/lurkar-du-pa-natet
title=$(lynx -source $url | grep "<title>" | sed 's/<title>//' | sed 's/<\/title>//' | iconv -f $1 -t $2)
echo "$title"
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 19:54
av Konservburk
ubot skrev:Är det bash eller PHP kod?

php
ubot skrev:Om jag har text från några olika sajter, hur konverterar jag till UTF-8 (om det inte redan är det)
Försök med kodsnutten som jag postade ovan.
ubot skrev:och dubbelkollar så att det inte finns några "replacement characters" i texten efter:
Det går inte eftersom
replacement characters "aldrig" finns i själva texten, utan kommer bara när den visas (ifall programmet som visar texten inte vet hur något tecken ska visas).
ubot skrev:UTF-8 (fel!):
http://blogg.aftonbladet.se/1/2009/11/l ... u-pa-natet
Sista är lurig. Den fintar PHPs mb_detect_encoding genom att säga att den är UTF-8, vilket inte stämmer! Om jag skriver ut sidans titel direkt i Terminalen så får jag "replacement characters" i texten, men inte om jag först konverterar från ISO-8859-1 till UTF-8. Då ser texten bra ut! Dvs texten är inte UTF-8 utan ISO-8859-1 från början!
Det där länken verkar innehålla en salig blandning av UTF-8 och
html entities (t.ex.
ä istället för
ä på vissa ställen).
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 19:56
av ubot
Konservburk skrev:ubot skrev:Är det bash eller PHP kod?

php
ubot skrev:Om jag har text från några olika sajter, hur konverterar jag till UTF-8 (om det inte redan är det)
Försök med kodsnutten som jag postade ovan.
ubot skrev:och dubbelkollar så att det inte finns några "replacement characters" i texten efter:
Det går inte eftersom
replacement characters "aldrig" finns i själva texten, utan kommer bara när den visas (ifall programmet som visar texten inte vet hur något tecken ska visas).
ubot skrev:UTF-8 (fel!):
http://blogg.aftonbladet.se/1/2009/11/l ... u-pa-natet
Sista är lurig. Den fintar PHPs mb_detect_encoding genom att säga att den är UTF-8, vilket inte stämmer! Om jag skriver ut sidans titel direkt i Terminalen så får jag "replacement characters" i texten, men inte om jag först konverterar från ISO-8859-1 till UTF-8. Då ser texten bra ut! Dvs texten är inte UTF-8 utan ISO-8859-1 från början!
Det där länken verkar innehålla en salig blandning av UTF-8 och
html entities (t.ex.
ä istället för
ä på vissa ställen).
Jag uppdaterade min förra post. La till lite info om problemet. Jag kodar om alla html entities mha PHP. Så html entities blir något annat format. Det finns en speciell funktion för det i PHP.
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 19:58
av ubot
Jag ska försöka med kodsnutten du skrev.
Jag har försökt med det här, men får inte ut något resultat alls:
bash:
#!/bin/bash
url=http\:\/\/blogg.aftonbladet.se/1/2009/11/lurkar-du-pa-natet
title=$(lynx -source $url | grep "<title>" | sed 's/<title>//' | sed 's/<\/title>//')
var1="$title" php test.php
PHP:
<?php
if (!iconv("UTF-8", "UTF-8", $_ENV['var1']))
{
$text = iconv("ISO-8859-1", "UTF-8", $_ENV['var1']);
echo $text;
}
//else
//{
//echo $ENV_['var1'];
//}
?>
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 20:01
av Konservburk
ubot skrev:Jag uppdaterade min förra post. La till lite info om problemet. Jag kodar om alla html entities mha PHP. Så html entities blir något annat format. Det finns en speciell funktion för det i PHP.
Där har du ju problemet.
Du kodar om alla
html entites till iso8859-1 oavsett om resten av texten är utf8 eller inte.
Gör istället så att du inte kodar om några
html entites innan du har testat om resten av texten är UTF-8 eller ISO-8859-1 och tala sedan om för
htmlspecialchars() till vilken av dem du vill konvertera.
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 20:05
av ubot
Konservburk skrev:ubot skrev:Jag uppdaterade min förra post. La till lite info om problemet. Jag kodar om alla html entities mha PHP. Så html entities blir något annat format. Det finns en speciell funktion för det i PHP.
Där har du ju problemet.
Du kodar om alla
html entites till iso8859-1 oavsett om resten av texten är utf8 eller inte.
Gör istället så att du inte kodar om några
html entites innan du har testat om resten av texten är UTF-8 eller ISO-8859-1 och tala sedan om för
htmlspecialchars() till vilken av dem du vill konvertera.
Aha, jag fintar alltså mig själv. Men varför kodas alla html entities om till ISO-8859-1 när texten är i UTF-8? Varför gör PHP på det sättet?
Den här raden har jag i min PHP-kod precis innan jag testar om texten är redan är UTF-8 eller ISO-8859-1 (för att isf omkoda texten till UTF-8):
$text = html_entity_decode($text);
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 20:11
av Konservburk
ubot skrev:Aha, jag fintar alltså mig själv. Men varför kodas alla html entities om till ISO-8859-1 när texten är i UTF-8? Varför gör PHP på det sättet?
Därför att php inte vet att texten är kodad i utf8!
Tala om för php vad du vill genom att använda charset-agrumentet när du avkodar html entities:
http://www.php.net/manual/en/function.h ... decode.php
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 20:15
av Konservburk
ubot skrev:$text = html_entity_decode($text);
Gör så här istället:
Kod: Markera allt
$text = html_entity_decode($text, ENT_QUOTES, "UTF-8");
Men bara om resten av texten redan är UTF-8, annars får du problem med blandad teckenkodning igen.
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 20:24
av ubot
Konservburk skrev:ubot skrev:$text = html_entity_decode($text);
Gör så här istället:
Kod: Markera allt
$text = html_entity_decode($text, ENT_QUOTES, "UTF-8");
Men bara om resten av texten redan är UTF-8, annars får du problem med blandad teckenkodning igen.
Ok, om texten inte är UTF-8 då utan ISO-8859-1. Går det bra att köra samma visa men byta ut UTF-8 mot ISO-8859-1. Det är så att jag kör en if-sats där jag först har hämtat encoding mha mb_detect_encoding() för att sedan släppa igenom texten oförändrad (med din rad i fortsättningen) om teckenkodningen är UTF-8 och annars konvertera från ISO-8859-1 till UTF-8.
Det borde fungera att slänga in din rad i if-satsen så att konverteringen bara görs om teckenkodningen är UTF-8, annars samma rad men med ISO-8859-1 på slutet.
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 20:31
av ubot
Hm, det här verkar lovande. Fy sjutton vad tragiskt om det bara hade räckt att flytta in html_entities_decode() i if-satsen för att få ordning på det här. Jag som har kämpat så med det här problemet.
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 20:36
av Konservburk
ubot skrev:Det borde fungera att slänga in din rad i if-satsen så att konverteringen bara görs om teckenkodningen är UTF-8, annars samma rad men med ISO-8859-1 på slutet.
I princip så borde det fungera, men det kan ju vara lite onödigt att konvertera fram och tillbaka när du ändå vet att du ska till utf8 i slutändan. Är nog bättre att först undersöka om texten är utf8, och om den inte är det så konverterar du till utf8. Först därefter konverterar du alla html enteties till utf8 också.
om texten inte är utf8
{
konvertera texten till utf8
}
konvertera html enteties till utf8
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 20:51
av ubot
Konservburk skrev:ubot skrev:Det borde fungera att slänga in din rad i if-satsen så att konverteringen bara görs om teckenkodningen är UTF-8, annars samma rad men med ISO-8859-1 på slutet.
I princip så borde det fungera, men det kan ju vara lite onödigt att konvertera fram och tillbaka när du ändå vet att du ska till utf8 i slutändan. Är nog bättre att först undersöka om texten är utf8, och om den inte är det så konverterar du till utf8. Först därefter konverterar du alla html enteties till utf8 också.
om texten inte är utf8
{
konvertera texten till utf8
}
konvertera html enteties till utf8
Jo, men jag gör det faktiskt. Jag använder mb_detect_encoding för att avgöra teckenkodning. Sedan omkodar jag texten till UTF-8 om det INTE redan är UTF-8 (enligt mb_detect_encoding) annars släpper jag igenom texten oförändrad (bortsett från att jag har html_entities_decode(... UTF-8 alt ISO-8859-1) inne i if-satsen).
Frågan är, går det att lita på mb_detect_encoding? Annars har jag problem...
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 21:04
av Konservburk
ubot skrev:bortsett från att jag har html_entities_decode(... UTF-8 alt ISO-8859-1) inne i if-satsen
Jag menade att du skulle flytta ut
html_entities_decode från if-satsen och istället lägga den nedanför och där alltid köra med UTF-8 (eftersom du vet att du har det direkt efter if-satsen).
Re: Hitta "replacement character" i text
Postat: 13 nov 2009, 21:15
av ubot
Konservburk skrev:ubot skrev:bortsett från att jag har html_entities_decode(... UTF-8 alt ISO-8859-1) inne i if-satsen
Jag menade att du skulle flytta ut
html_entities_decode från if-satsen och istället lägga den nedanför och där alltid köra med UTF-8 (eftersom du vet att du har det direkt efter if-satsen).
Ja, ja, det är klart, efteråt istället för precis innan. Det spelar ingen större roll iofs. En annan fråga. Det verkar inte som om min replacement funktion fungerar längre. Jag har en sträng som byter ut vissa tecken mot andra, tex:
$order = array("«", ...);
$item = str_replace($order, "-", $item);
Varför fungerar inte den här längre, beror det på att jag kodat om html entities eller vad?
Re: Hitta "replacement character" i text
Postat: 14 nov 2009, 00:26
av ubot
Nej, det går nog inte att lita på mb_detect_encoding(). Den säger ISO-8859-1 om en länk som är UTF-8. Det var inte, bra alls.
Här är länken som mb_detect_encoding() säger är ISO-8859-1 är egentligen UTF-8 vilket sabbar teckenkodningen:
http://www.newsmill.se/artikel/2009/11/ ... llas-hemma