Hitta "replacement character" i text
Hitta "replacement character" i text
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?
-
- Inlägg: 6191
- Blev medlem: 14 jan 2007, 19:31
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Ort: Stockholm
Re: Hitta "replacement character" i text
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?
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
Jag vill göra det här: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?
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".
-
- Inlägg: 6191
- Blev medlem: 14 jan 2007, 19:31
- OS: Ubuntu
- Utgåva: 22.10 Kinetic Kudu
- Ort: Stockholm
Re: Hitta "replacement character" i text
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.
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.
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Hitta "replacement character" i text
Testa detta: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!
Kod: Markera allt
if (!iconv("UTF-8", "UTF-8", $text))
{
$text = iconv("ISO-8859-1", "UTF-8", $text);
}
Re: Hitta "replacement character" i text
Är det bash eller PHP kod?Konservburk skrev:Testa detta: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!
Kod: Markera allt
if (!iconv("UTF-8", "UTF-8", $text)) { $text = iconv("ISO-8859-1", "UTF-8", $text); }

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"
Senast redigerad av 3 ubot, redigerad totalt 13 gång.
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Hitta "replacement character" i text
phpubot skrev:Är det bash eller PHP kod?
Försök med kodsnutten som jag postade ovan.ubot skrev:Om jag har text från några olika sajter, hur konverterar jag till UTF-8 (om det inte redan är det)
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:och dubbelkollar så att det inte finns några "replacement characters" i texten efter:
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).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!
Re: Hitta "replacement character" i text
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.Konservburk skrev:phpubot skrev:Är det bash eller PHP kod?
Försök med kodsnutten som jag postade ovan.ubot skrev:Om jag har text från några olika sajter, hur konverterar jag till UTF-8 (om det inte redan är det)
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:och dubbelkollar så att det inte finns några "replacement characters" i texten efter:
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).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!
Re: Hitta "replacement character" i text
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'];
//}
?>
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'];
//}
?>
Senast redigerad av 1 ubot, redigerad totalt 13 gånger.
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Hitta "replacement character" i text
Där har du ju problemet.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.

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
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?Konservburk skrev:Där har du ju problemet.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.
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.
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);
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Hitta "replacement character" i text
Därför att php inte vet att texten är kodad i utf8!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?
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
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Hitta "replacement character" i text
Gör så här istället:ubot skrev:$text = html_entity_decode($text);
Kod: Markera allt
$text = html_entity_decode($text, ENT_QUOTES, "UTF-8");
Re: Hitta "replacement character" i text
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.Konservburk skrev:Gör så här istället:ubot skrev:$text = html_entity_decode($text);
Men bara om resten av texten redan är UTF-8, annars får du problem med blandad teckenkodning igen.Kod: Markera allt
$text = html_entity_decode($text, ENT_QUOTES, "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
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.
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Hitta "replacement character" i text
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å.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.
om texten inte är utf8
{
konvertera texten till utf8
}
konvertera html enteties till utf8
Re: Hitta "replacement character" i text
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).Konservburk skrev: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å.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.
om texten inte är utf8
{
konvertera texten till utf8
}
konvertera html enteties till utf8
Frågan är, går det att lita på mb_detect_encoding? Annars har jag problem...
- Konservburk
- Inlägg: 5919
- Blev medlem: 07 apr 2007, 22:28
Re: Hitta "replacement character" i text
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).ubot skrev:bortsett från att jag har html_entities_decode(... UTF-8 alt ISO-8859-1) inne i if-satsen
Re: Hitta "replacement character" i text
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:Konservburk skrev: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).ubot skrev:bortsett från att jag har html_entities_decode(... UTF-8 alt ISO-8859-1) inne i if-satsen
$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
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
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