Kroatische tekens ISO-8859-1 naar UTF-8

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 20-06 22:05
Ik heb moeite met het omzetten van een Kroatische text van ISO-8859-1 naar UTF-8.

Ik heb een PHP script dat de volgende zaken doet.

1. Het haalt HTML data van een url in ISO-8859-1 tekenset.


Tekst is Kroatisch, bijvoorbeeld:

Ovdje se uz mnogo trgovina nalazi i kuglana, biljarska dvorana, igraona, frizerski salon, te rent-a-bike.

Tjekom dana možete sudjelovati u mnogim aktivnostima. Dok se djeca zabavljaju sa animacijkim timom u raznim radionicama ili u mini klubu, odnosno junior klubu, Vi možete sudjelovati u aerobiku ili pak teèaju plesa. Naveèer možete pogledati razne priredbe u kazalištu, a kasnije zabavu možete potražiti u diskoteci "Coco Loco".

PHP:
1
2
3
4
5
6
7
8
9
10
<?php
// get converter HTML
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,$url);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'TDX Converter');
$converterHtml = curl_exec($curl_handle);
curl_close($curl_handle);
?>


2. Er worden wat manipulaties gedaan aan de data
Hiervoor gebruik ik simplehtmldom

3. De data wordt geconverteerd naar utf8 en weergegeven.
echo (utf8_encode($convertedHtml));

Probleem

Het probleem is dat tekens zoals: 'ž' niet worden weergegeven. In plaats daarvan zie ik van die rare vraagtekentjes.

Daarom heb ik onderstaande functie gemaakt, maar dat helpt helaas niets...


<?php

// croatian entities
function charsToEnts($string) {
$chars = array (
"Č" => "&#268;",
"č" => "&#269;",
"Ć" => "&#262;",
"ž" => "&#382;"
);

foreach ($chars as $char => $ent) {
$string = str_replace($char, $ent, $string);
}

return $string;
}

$convertedHtml = charsToEnts($convertedHtml);

?>


Kan iemand me helpen om Poolse en Kroatische tekens om te zetten naar UTF-8?

---


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Kijk eens naar mb_string: http://nl.php.net/mb_string

Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 20-06 22:05
Daar was ik intussen al beland, maar kom er echt niet uit..

Doe ik iets verkeerd?

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');

/* Set internal character encoding to UTF-8 */
mb_internal_encoding("UTF-8");
mb_http_output( "UTF-8" );

/* Display current internal character encoding */
echo mb_internal_encoding();
echo mb_http_output();

// croatian entities
function charsToEnts($string) {
$chars = array (
"Č" => "&#268;",
"č" => "&#269;",
"Ć" => "Ć",
"ć" => "ć",
"Đ" => "Đ",
"đ" => "đ",
"Ŝ" => "&#352;",
"š" => "&#353;",
"Ž" => "&#381;",
"ž" => "&#382;"
);

foreach ($chars as $char => $ent) {
$string = mb_ereg_replace($char, $ent, $string);
}

return $string;
}

header("Content-Type: text/html; charset=utf-8");

$url = "http://www.visit-croatia.co.uk/croatianfortravellers/chapternine.htm";

function file_get_contents_utf8($fn) {
$content = file_get_contents($fn);
return mb_convert_encoding($content, 'UTF-8',
mb_detect_encoding($content, 'UTF-8, ISO-8859-1', true));
}

$tdxHtml = file_get_contents_utf8($url);
/*
// get TDX HTML
$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,$url);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'TDX Converter');
$tdxHtml = curl_exec($curl_handle);
curl_close($curl_handle);
*/
/* Detect character encoding with current detect_order */
echo mb_detect_encoding($tdxHtml);

$tdxHtml = charsToEnts($tdxHtml);
$tdxHtml = $tdxHtml;

echo($tdxHtml);

phpinfo();
?>

---


Acties:
  • 0 Henk 'm!

  • Tarilo
  • Registratie: December 2007
  • Laatst online: 10-09 19:49
Tip: gebruik [code] [/code] tags. En in het geval van php [php] tags

[ Voor 35% gewijzigd door Tarilo op 03-12-2009 21:03 ]


Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 20-06 22:05
Dat heb ik geprobeerd, maar dan worden mijn vreemde tekens niet goed weergegeven.

---


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 13:12

crisp

Devver

Pixelated

RePlayer schreef op donderdag 03 december 2009 @ 21:12:
Dat heb ik geprobeerd, maar dan worden mijn vreemde tekens niet goed weergegeven.
Het is nu echter niet duidelijk of je entities aan het converteren bent, of karakters wilt omzetten naar entities. In elk geval zou beide niet nodig moeten zijn omdat UTF-8 juist al deze tekens gewoon in zich heeft. Van latin-1 naar UTF-8 zou niet meer nodig moeten hebben dan utf8_encode. Weet je wel zeker dat je je eigen pagina wel echt als UTF-8 verstuurd?

Aan de andere kant lijken me 'vraagtekentjes' meer het gevolg van een non-unicode font...

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 20-06 22:05
Wat ik probeer is een pagina in ISO-8859-1 tekenset, (bijvoorbeeld: http://www.visit-croatia....vellers/pronunciation.htm) binnen te halen in php met curl oid, en vervolgens te converteren naar, en weer te geven als UTF-8 pagina.

Ik wil het liefst geen entities gebruiken omdat ik de HTML nog moet gebruiken, dus tekens als "<" mogen geen entitie worden.

Ik wil dus echt alleen de karakters omzetten van ISO-8859-1 naar UTF-8.

Het teken "š" is een die bijvoorbeeld niet wordt weergegeven.

utf8_encode ben ik mee begonnen in eerste instantie. En in de header heb ik aangegeven dat het als UTF-8 verzonden moet worden. In Firefox kan ik ook zien dat het UTF-8 wordt weergegeven..


---
Ik zie net dat veel bijzondere karakters in dat bestand als htmlentities staan, en het daarom dus sowieso doen. De "š" staat er gewoon zo in, daarom wil die niet weergeven..

[ Voor 42% gewijzigd door RePlayer op 03-12-2009 23:51 ]

---


Acties:
  • 0 Henk 'm!

  • dik_voormekaar
  • Registratie: April 2003
  • Laatst online: 10-09 22:00
Heb je wel een meta tag in je pagina voor UTF-8 ?
code:
1
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 13:12

crisp

Devver

Pixelated

Hmmz, utf8_encode zet dus niet de codepoints om van de extended karakters...

Dan zal je zoiets moeten doen ipv utf8_encode:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
$latin_to_utf8 = array(
    "\x80" => "\xE2\x82\xAC",  // EURO SIGN
    "\x82" => "\xE2\x80\x9A",  // SINGLE LOW-9 QUOTATION MARK
    "\x83" => "\xC6\x92",      // LATIN SMALL LETTER F WITH HOOK
    "\x84" => "\xE2\x80\x9E",  // DOUBLE LOW-9 QUOTATION MARK
    "\x85" => "\xE2\x80\xA6",  // HORIZONTAL ELLIPSIS
    "\x86" => "\xE2\x80\xA0",  // DAGGER
    "\x87" => "\xE2\x80\xA1",  // DOUBLE DAGGER
    "\x88" => "\xCB\x86",      // MODIFIER LETTER CIRCUMFLEX ACCENT
    "\x89" => "\xE2\x80\xB0",  // PER MILLE SIGN
    "\x8A" => "\xC5\xA0",      // LATIN CAPITAL LETTER S WITH CARON
    "\x8B" => "\xE2\x80\xB9",  // SINGLE LEFT-POINTING ANGLE QUOTATION MARK
    "\x8C" => "\xC5\x92",      // LATIN CAPITAL LIGATURE OE
    "\x8E" => "\xC5\xBD",      // LATIN CAPITAL LETTER Z WITH CARON
    "\x91" => "\xE2\x80\x98",  // LEFT SINGLE QUOTATION MARK
    "\x92" => "\xE2\x80\x99",  // RIGHT SINGLE QUOTATION MARK
    "\x93" => "\xE2\x80\x9C",  // LEFT DOUBLE QUOTATION MARK
    "\x94" => "\xE2\x80\x9D",  // RIGHT DOUBLE QUOTATION MARK
    "\x95" => "\xE2\x80\xA2",  // BULLET
    "\x96" => "\xE2\x80\x93",  // EN DASH
    "\x97" => "\xE2\x80\x94",  // EM DASH
    "\x98" => "\xCB\x9C",      // SMALL TILDE
    "\x99" => "\xE2\x84\xA2",  // TRADE MARK SIGN
    "\x9A" => "\xC5\xA1",      // LATIN SMALL LETTER S WITH CARON
    "\x9B" => "\xE2\x80\xBA",  // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
    "\x9C" => "\xC5\x93",      // LATIN SMALL LIGATURE OE
    "\x9E" => "\xC5\xBE",      // LATIN SMALL LETTER Z WITH CARON
    "\x9F" => "\xC5\xB8"       // LATIN CAPITAL LETTER Y WITH DIAERESIS
);

// opvullen
for($x = 128; $x < 256; $x++)
{
    $c = chr($x);
    if (!isset($latin_to_utf8[$c]))
        $latin_to_utf8[$c] = utf8_encode($c);
}

echo strtr($converterHtml, $latin_to_utf8);

(deels op basis van de comments http://php.net/utf8_encode)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • RePlayer
  • Registratie: September 2003
  • Laatst online: 20-06 22:05
Ja dat werkt! Ontzettend bedankt! :)

Maar ik snap nog niet helemaal hoe het werkt.... :/

De functie strtr vervangt dit "\x9A" door dit "\xC5\xA1". Maar wat zijn die gegevens? En hoe kan het dat ik die niet kan zien in de broncode van een HTML bestand?

Waar komen deze waarden 128 en 256 vandaan? --> for($x = 128; $x < 256; $x++).

---


Acties:
  • 0 Henk 'm!

  • Sendy
  • Registratie: September 2001
  • Niet online
ASCII gebruikt de eerste 128 waarden, en "extended" ASCII de laatste 128 waarden. Volgens Crisp doet utf8_encode niet de "extended" waarden.

x9A is byte waarde 9A (in hexadecimaal) en dat wordt vervangen door twee bytes (hex) C5A1. UTF-8 kan tot 4 bytes per teken gebruiken. Je ziet de tekens en niet de bytes.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

crisp schreef op vrijdag 04 december 2009 @ 10:04:
Hmmz, utf8_encode zet dus niet de codepoints om van de extended karakters...
Het punt is dat het helemaal geen ISO-8859-1 is, maar Windows-1252. De tekens tussen 0x80 - 0x9f zijn ook control codes en hebben daarom helemaal geen specifieke unicode codepoints. De meeste browsers gebruiken voor die chars dan ook maar de Windows-1252 codepoints omdat dat doorgaans is wat de maker van de website bedoelde.

Beter gebruik je dus ook gewoon mb_convert_encoding, die van de ene encoding naar de andere kan converteren.

PHP:
1
echo mb_convert_encoding("\x9e", "UTF-8", "Windows-1252");

Dit geeft wél het juiste resultaat.

[ Voor 18% gewijzigd door .oisyn op 04-12-2009 13:36 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 13:12

crisp

Devver

Pixelated

hmmz, ik wist dat er wat geks was met die range :P. En ja, je kan inderdaad ook de mb_convert_encoding functie gebruiken, of iconv.

Intentionally left blank

Pagina: 1