<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BBProject.net &#187; charset</title>
	<atom:link href="http://www.bbproject.net/tag/charset/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bbproject.net</link>
	<description>Programowanie, webmastering, informatyka</description>
	<lastBuildDate>Tue, 03 Aug 2010 08:22:56 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Kodowanie polskich znaków w PHP</title>
		<link>http://www.bbproject.net/2009/12/kodowanie-polskich-znakow-w-php/</link>
		<comments>http://www.bbproject.net/2009/12/kodowanie-polskich-znakow-w-php/#comments</comments>
		<pubDate>Sat, 26 Dec 2009 11:20:25 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Webmastering]]></category>
		<category><![CDATA[charset]]></category>
		<category><![CDATA[header]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[kodowanie]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=93</guid>
		<description><![CDATA[Prawdziwym problemem dla początkujących programistów PHP, może być nie rzadko brak wyświetlania polskich znaków w skryptach PHP. Zamiast miotać się pomiędzy różnymi edytorami kodu, które w taki czy inny sposób oferują zmianę kodowania pliku, prześledźmy po kolei wszystkie etapy tej przypadłości i rozwiążmy je raz na zawsze. Przyczyny mogą być różne, od błędnego zapisania pliku, [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-thumbnail wp-image-94" title="Polski font" src="http://www.bbproject.net/wp-content/uploads/2009/12/pl_font-160x113.png" alt="" width="160" height="113" />Prawdziwym problemem dla początkujących programistów PHP, może być nie rzadko brak wyświetlania polskich znaków w skryptach PHP. Zamiast miotać się pomiędzy różnymi edytorami kodu, które w taki czy inny sposób oferują zmianę kodowania pliku, prześledźmy po kolei wszystkie etapy tej przypadłości i rozwiążmy je raz na zawsze.</p>
<p>Przyczyny mogą być różne, od błędnego zapisania pliku, aż po wymuszone kodowanie znaków w nagłówku HTTP. Jeśli spotkałeś się nie raz z popularnymi krzakami na swojej stronie, zamiast polskich znaków diakrytycznych, to zapraszam do przeczytania dalszej części wpisu.</p>
<p><span id="more-93"></span>Po pierwsze musimy zdecydować się na jakiś system kodowania znaków, których używamy w tworzonych plikach. W moim przypadku będzie to, obecnie najpopularniejszy, system <a href="http://pl.wikipedia.org/wiki/UTF-8"><em>utf-8</em></a>. Nic nie stoi przeszkodzie aby używać chociażby <em>iso-8859-2</em>, jednakże <em>utf-8</em> oferuje nam znacznie szerszy zestaw znaków i jest obsługiwany obecnie przez coraz więcej systemów docelowych (np.: przeglądarki mobilne).</p>
<h4>Edytor</h4>
<p>Zacznijmy od edytora w jakim tworzymy nasz skrypt. Początkowo jest to zapewne systemowy notatnik. Program ten, o ile nie wybierzemy inaczej, domyślnie zapisuje pliki w kodowaniu <em>windows-1250</em>. Kodowanie to obsługiwane jest wyłącznie na systemach firmy Microsoft i należy go unikać jak ognia na dzień dzisiejszy. Podczas zapisywania pliku, mamy możliwość zmiany na <em>utf-8</em> na dole okna dialogowego &#8211; pole wyboru <em>Kodowanie</em>.</p>
<p>Osobiście, polecam korzystanie z narzędzi o większych możliwościach, takich jak środowiska <a href="http://www.netbeans.org">NetBeans</a> czy <a href="http://www.eclipse.org">Eclipse</a>. Mogą one wyglądać skomplikowanie dla początkującego programisty, jednakże oferują gamę udogodnień i przydatnych funkcji.</p>
<h4>Sekcja meta</h4>
<p>Przypuśćmy że mamy już poprawnie zapisany plik w wybranym przez nas systemie kodowania znaków. Uruchamiamy skrypt na lokalnym bądź wirtualnym serwerze a naszym oczom ukazują się znaczki o nieznanym dla nas pochodzeniu, które na pewno nie są naszymi rodzimymi ogonkami.</p>
<p>Drugim, często popełnianym błędem, jest brak sekcji <em>meta</em> strony, informującej o jej kodowaniu. Aby poprawnie zdefiniować kodowanie dokumentu HTML, używamy następującego zapisu:</p>
<pre class="brush: xml">&lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;</pre>
<p>&#8230;który umieszczamy między znacznikami <em>&lt;head&gt;</em>&#8230;<em>&lt;/head&gt;</em>. Przykładowo:</p>
<pre class="brush: xml">&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;
    &lt;title&gt;Moja strona w utf-8&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;...&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Co jednak zrobić jeśli wciąż nie otrzymujemy oczekiwanego efektu?</p>
<h4>Nagłówek HTTP</h4>
<p>Nagłówek protokołu <a href="http://pl.wikipedia.org/wiki/Hypertext_Transfer_Protocol">HTTP</a> zawiera szereg informacji przesyłanych do przeglądarki, mówiący o tym co tak właściwie jest wysyłane. Jedną z tych informacji jest kodowanie znaków dokumentu &#8211; znowu.</p>
<p>Problem polega na tym, iż przeglądarki wyświetlają stronę w takim kodowaniu, jakie zostało im przedstawione w nagłówku protokołu. W praktyce to co zostało zdefiniowane w sekcji meta strony nie ma znaczenia, chyba że nagłówek HTTP nie zawiera takiej informacji.</p>
<p>Bardzo często, parser PHP ma wymuszone wysyłanie dokumentów w jednym, określonym systemie kodowania znaków. Odpowiada za to następujący wpis w pliku konfiguracji <em>php.ini</em>:</p>
<pre class="brush: plain">default_charset = "iso-8859-1"</pre>
<p>O ile dysponujemy własnym, lokalnie postawionym serwerem, możemy łatwo edytować bądź całkowicie wyłączyć tą linię, to w przypadku serwera wirtualnego z reguły nie posiadamy takiej władzy.</p>
<p>W takim wypadku musimy nadpisać sami nagłówek HTTP w skrypcie PHP. Służy do tego polecenie <em><a href="http://php.net/manual/en/function.header.php">header</a></em>. Nas interesuje oczywiście zmiana samego kodowania, inne możliwości tej komendy na razie zostawmy w spokoju. Dodajemy zatem do naszego skryptu następującą linię:</p>
<pre class="brush: php">header('Content-Type: text/html; charset=utf-8');</pre>
<p>Nie mniej musimy pamiętać o tym, że ustawienie parametru nagłówka HTTP przy pomocy w/w komendy, musi nastąpić zanim wyślemy jakiekolwiek inne dane do przeglądarki. Innymi słowy, nie może użyć polecenia <em>echo</em> czy też <em>print</em> zanim nie ustawimy nagłówka. Jak sama nazwa wskazuje, jest to nagłówek, czyli znajduje się przed docelową treścią dokumentu.</p>
<h4>Podsumowanie</h4>
<p>Mój docelowy plik, jaki stworzyłem na potrzeby tego wpisu, prezentuje się następująco:</p>
<pre class="brush: php">&lt;?php header('Content-Type: text/html; charset=utf-8'); ?&gt;
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta http-equiv="content-type" content="text/html; charset=utf-8"&gt;
    &lt;title&gt;Moja strona w utf-8&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;p&gt;&lt;?php echo 'ęóąśłżźćń'; ?&gt;&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Jak widzimy, wymusiliśmy tutaj kodowanie <em>utf-8</em> w nagłówku HTTP, sekcji <em>meta</em>, oraz sam plik został zapisany z poprawnym kodowaniem znaków. Tak przygotowany dokument, nie powinien sprawiać żadnych problemów w dowolnej konfiguracji serwera. W efekcie otrzymamy poprawnie zakodowane oraz wyświetlone polskie znaki diakrytyczne.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2009/12/kodowanie-polskich-znakow-w-php/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
