Autor Zpráva
esonyx
Profil *
Ahoj, prosím vás mám problém z vytvořením souboru v utf-8. Mám řetězec v prměnné "obsahsouboru" který jsem vložil formulářem a odeslal na tento script.
  

<?php
  $obsahsouboru="vrátit se k Zemi a bezpečně přistát";
  $obsahsouboru=str_replace("ě",chr(196).chr(155),$obsahsouboru);
  $obsahsouboru=str_replace("š",chr(197).chr(161),$obsahsouboru);
  $obsahsouboru=str_replace("ř",chr(197).chr(153),$obsahsouboru);
  $obsahsouboru=str_replace("ý",chr(195).chr(189),$obsahsouboru);
  $obsahsouboru=str_replace("á",chr(195).chr(161),$obsahsouboru);
  $obsahsouboru=str_replace("í",chr(195).chr(173),$obsahsouboru);
  $obsahsouboru=str_replace("é",chr(195).chr(169),$obsahsouboru);
  $obsahsouboru=str_replace("ú",chr(195).chr(186),$obsahsouboru);
  $obsahsouboru=str_replace("ů",chr(197).chr(175),$obsahsouboru);
  $obsahsouboru=str_replace("ď",chr(196).chr(143),$obsahsouboru);
  $obsahsouboru=str_replace("ť",chr(197).chr(165),$obsahsouboru);
  $obsahsouboru=str_replace("ň",chr(197).chr(136),$obsahsouboru);
  $obsahsouboru=str_replace("ó",chr(195).chr(179),$obsahsouboru);
  $obsahsouboru=str_replace("Ě",chr(196).chr(154),$obsahsouboru);
  $obsahsouboru=str_replace("Š",chr(197).chr(160),$obsahsouboru);
  $obsahsouboru=str_replace("Č",chr(196).chr(140),$obsahsouboru);
  $obsahsouboru=str_replace("Ř",chr(197).chr(152),$obsahsouboru);
  $obsahsouboru=str_replace("Á",chr(195).chr(129),$obsahsouboru);
  $obsahsouboru=str_replace("É",chr(195).chr(137),$obsahsouboru);
  $obsahsouboru=str_replace("Ť",chr(197).chr(164),$obsahsouboru);
  $obsahsouboru=str_replace("Ň",chr(197).chr(135),$obsahsouboru);
  $obsahsouboru=str_replace("Ó",chr(195).chr(147),$obsahsouboru);
  $obsahsouboru=str_replace("Ý",chr(195).chr(157),$obsahsouboru);
  $obsahsouboru=str_replace("Ú",chr(195).chr(154),$obsahsouboru);
  $obsahsouboru=str_replace("Ů",chr(197).chr(174),$obsahsouboru);
  $obsahsouboru=str_replace("Í",chr(195).chr(141),$obsahsouboru);
  $obsahsouboru=str_replace("ž",chr(197).chr(190),$obsahsouboru);
  $obsahsouboru=str_replace("Ž",chr(197).chr(189),$obsahsouboru);
  $obsahsouboru=str_replace("č",chr(196).chr(141),$obsahsouboru);
  $obsahsouboru=str_replace("Ď",chr(196).chr(142),$obsahsouboru);
$soubor=fopen("soubor.txt", "w+");
fwrite($soubor, utf8_encode ("$obsahsouboru"));
fclose($soubor); 
?>


Script je v souboru který jé kodován v UTF-8, ale stejně se mi nepodařilo uložit soubor s českou diakritikou. Muže mi prosím vás někdo pomoci? Děkuji vám.


obsah souboru: vrátit se k Zemi a bezpeènì pøistát
esonyx
Profil *
Jěště dodávám že soubor musí být taky kodován v UTF-8. :o)
Majkl578
Profil
Za předpokladu, že PHP script je napsán v UTF-8 a také jej používá, tak toto:
$s = 'vrátit se k Zemi a bezpečně přistát';
$soubor = fopen('/tmp/soubor.txt', 'w');
fwrite($soubor, $s);
fclose($soubor);

uloží do souboru onen řetězec v kódování UTF-8 bez potřeby konvertování, encodování, str_replacování apod.
esonyx
Profil *
Ano php script je napsán v utf-8, ale pokud vynechám "utf8_encode" tak se mi potom soubor neuloží v UTF-8, ale ANSI (předpokládám "win-1250"). Ale program který používá toho souboru jako vstupní data, mi ho vezme pouze pokud je uložen v UTF-8 (v opačným připadě se mi chová jako by tam nebyl, proto ho tak potrebuji uložit).
AM_
Profil
Pokud je ten PHP soubor v UTF-8, vyhoď celou tu sekci se str_replace, vyhoď utf8_encode a mělo by to fungovat. Pokud ne, problém je zřejmě jinde.
esonyx
Profil *
Zapoměl jsem dodat, že "soubor.txt" nikdy neexistuje a při spuštění scriptu se mi výdy vytvoří soubor nový s identickým ID-čkem. Vygoogloval jsem si nějaké funkce které mi soubor vytvoří už v utf-8, ale zatím se mi nedaří je rozjet (1/jsem začátečník v php 2/bude otázka jestli když už tak bude vytvořený jestli se také tak uloží.).
Kajman_
Profil *
Ano php script je napsán v utf-8
Jste si jistý? Raději to ještě třikrát zkontrolujte.
Joker
Profil
esonyx:
Nevyžaduje ten program třeba na začátku souboru BOM nebo tak něco (i když ten utf8_encode asi nedoplňuje)?
esonyx
Profil *
AM_: ano to jsem vyhodil, ale soubor se vytvoří, zapíší se data, ale není uložený v UTF-8 ale v ANSI.
esonyx
Profil *
Kajman_: ano jsem si jistý 100% jistý. Někde jsem četl že by problém mohl být v tom že do formuláře to vkládam z windowsů, ale to se mi nezdá protože mám php kodovaný v UTF8 a proměnné se mi zobrazí správně (echo).

Joker: BOM? nevim o co se jedná (jsem neznalý)


Tohle jsem našel na cz2.php.net/manual/en/function.fopen.php

<?php
// Reads past the UTF-8 bom if it is there.
function fopen_utf8 ($filename, $mode) {
    $file = @fopen($filename, $mode);
    $bom = fread($file, 3);
    if ($bom != b"\xEF\xBB\xBF")
        rewind($file, 0);
    else
        echo "bom found!\n";
    return $file;
}
?>


ale jsme zase u toho že nevím co je to BOM a stejně mi to nejde, ale ten zavináč by tam bát neměl ne? před fopen.
nightfish
Profil
esonyx:
ano jsem si jistý 100% jistý
dobře tedy, v jakém editoru ten soubor editujete?
Joker
Profil
esonyx:
BOM jsou dva bajty na začátku UTF-8 souboru, které identifikují, v jakém pořadí bajtů (jestli od nejméně významného k nejvýznamnějšímu, nebo naopak) jsou písmena uložena.
Pro tenhle problém je ale důležitější, že jejich přítomnost se někdy používá pro rozpoznání Unicode kódování. Tj. pokud soubor má na začátku BOM, s vysokou pravděpodobností jde o Unicode. Pokud nemá, může to být cokoliv (včetně Unicode ovšem).

Každopádně tedy ta podstatná otázka zní:
Podle čeho ten čtecí program rozpoznává kódování souboru?
esonyx
Profil *
nightfish: klasiký poznámkový blok ve win 7, když soubor ukládám dám uložit ve formátu UTF-8. Pokud je tak uložený i s diakritikou, tak mi jej lister v total commanderu zobrazi v kodování UTF8 správně. Nebo dělám chybu v tomhle? Zkusím si vyzkoušet jiný program.
esonyx
Profil *
Joker: no tak to opravdu nevím. Na začátku souboru není nic, (nevim zdali má být bom viditelný, to jsem na wiki nenasel) ale jde o to, že pokud ten soubor stahnu zpět ze serveru tak je uložený v ANSI, a když dám v poznámkovém bloku uložit jako a v UTF8, tak mi vše funguje. Vyřešil jsem to s tím encode_utf8, ale tam se mi zase nezobrazila korektně čeština.
Majkl578
Profil
BOM jsou 3 neviditelné znaky na začátku. Ale není třeba.
Pokud je vše správně, bude fungovat to co jsem napsal v [#3].
esonyx
Profil *
Ahoj po dlouhé době, jen píšu výsledek. Soubory *.php byly uloženy v UTF8, proměnné byly taky v UTF8. Ale stejně mi je server kvalitne.cz ukladal v cp1250. Pokud jsem proměnou ukladal do souboru přes "fopen_utf8", pak se mi v něm nezobrazila čeština ať jsem zkoušel jaké koliv kombinace. Nakonec jsem tedy vynechal v kódu "fopen_utf8", soubor klasicky uložil, po té jsem ho otevřel, jeho obsah změnil pomocí:
$data_v_utf8 = iconv('cp1250','utf-8',$data_v_1250);
a už jsou soubory uložené jak mají být i s češtinou v UTF8 :o)
esonyx
Profil *
PS: str_replace jsem taky z kódu vymazal.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: