<?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>Perlover&#039;s Blog &#187; unicode</title>
	<atom:link href="http://blog.perlover.com/tag/unicode/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.perlover.com</link>
	<description>Blog about Unix, Perl, Firefox, JavaScript and other internet technologies</description>
	<lastBuildDate>Fri, 20 Jan 2012 15:23:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Кратко об UTF-8</title>
		<link>http://blog.perlover.com/2009/11/10/easy-about-utf8/</link>
		<comments>http://blog.perlover.com/2009/11/10/easy-about-utf8/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 09:54:02 +0000</pubDate>
		<dc:creator>Perlover</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[utf8]]></category>

		<guid isPermaLink="false">http://blog.perlover.com/?p=237</guid>
		<description><![CDATA[Этот пост для тех, кто не понимает, что такое UTF-8, хочет это понять, но доступная документация часто очень обширно освещает этот вопрос ...]]></description>
			<content:encoded><![CDATA[<h2>Просто об UTF-8</h2>
<p>Этот пост для тех, кто не понимает, что такое UTF-8, но хочет это понять, а доступная документация часто очень обширно освещает этот вопрос. Я попробую здесь описать это так, как сам бы хотел, чтобы раньше мне кто-то так рассказал. Так как часто у меня по поводу UTF-8 была в голове каша.</p>
<h2>Несколько простых правил</h2>
<ol>
<li>Итак, UTF-8 &#8212; это «обертка» для Unicode. Это не отдельная кодировка символов, это «обертнутый» Unicode. Вы, наверное, знаете Base64 кодировку, или слышали о ней &#8212; она может обернуть бинарные данные в печатаемые символы. Дак вот, UTF-8 это такой же Base64 для Unicode, как Base64  для бинарных данных. Это раз. Если вы это поймете, то уже многое станет ясно. И она также, как Base64, признана решить проблему совместимости в символах (Base64 была придумана для email, чтобы передавать файлы почтой, в которой все символы &#8212; печатаемые)</li>
<li>Далее, если код работает с UTF-8, то внутри он все равно работает с Unicode кодировками, то есть, где-то глубоко внутри есть таблицы символов именно Unicode символов. Правда, можно не иметь таблиц символов Unicode, если надо просто посчитать, сколько символов в строке, например (см. ниже)</li>
<li>UTF-8 сделан с той целью, чтобы старые программы и сегодняшние компьютеры могли работать нормально с Unicode символами, как со старыми кодировками, типа KOI8, Windows-1251 и т.п.. В UTF-8 нет байтов с нулями, все байты &#8212; они либо от 0&#215;01 &#8212; 0x7F, как обычный ASCII, либо 0&#215;80 &#8212; 0xFF, что также работает под программами, написанными на Си, как и работало бы не с ASCII символами. Правда, для корректной работы с символами программа должна знать Unicode таблицы.</li>
<li>Все, что имеет старший 7-ой бит в байте (если считать биты с нулевого) UTF-8 &#8212; часть кодированного потока Unicode.</li>
</ol>
<h2>UTF-8 изнутри</h2>
<p>Если вы знаете битовую систему, то вот вам <strong>краткая памятка</strong>, как кодируется UTF-8:</p>
<p>Первый байт Unicode символа в UTF-8 начинается с байта, где 7-ой бит всегда единица, и 6-ой бит всегда также единица. При этом в первом байте, если смотреть на биты слева направо (7-ой, 6-ой и так до нулевого), идет столько единиц, сколько байтов, включая первый, идет на кодирование одного Unicode символа. Заканчивается последовательность единиц нулем. А после этого идут биты самого Unicode символа. Остальные биты Unicode символа попадают во второй, или даже в третий байты (максимум три, почему &#8212; смотрите чуть ниже). Остальные байты, кроме первого, всегда идут с началом &#8217;10&#8242; и потом 6 битов следующей части Unicode символа.</p>
<h2>Пример</h2>
<p>Например:  есть байты <strong><span style="color: #ff0000;">110</span>10000 </strong>и второй <strong><span style="color: #ff0000;">10</span>011110</strong>. Первый &#8212; начинается с &#8217;110&#8242; &#8212; это значит, что раз две единицы &#8212; будет два байта UTF-8 потока, и второй байт, как и все остальные, начинается с &#8217;10&#8242;. А кодируют эти два байта символ Unicode, который состоит из 10100 битов от первого куска + 101101 от второго, получается [10000][011110] -&gt;  10000011110 -&gt; <strong>41E</strong> в 16-ричной системе, или <a href="http://www.fileformat.info/info/unicode/char/041e/index.htm" target="_blank"><strong>U+041E</strong></a> в написании Unicode обозначений. Это <a href="http://www.fileformat.info/info/unicode/char/041e/index.htm" target="_blank">символ большая русская О</a>.</p>
<h2>Сколько максимум байт на символ?</h2>
<p>Также, давайте посмотрим, сколько максимум байт уходит в UTF-8, чтобы закодировать 16 бит кодировки Unicode. Вторые и далее байты всегда максимум могут вместить 6 бит. Значит, если начать с конечных байтов, то два байта уйдут точно (2-ой и третий), а первый должен начинаться с &#8217;1110&#8242;, чтобы закодировать три. Значит первый байт максимум в таком варианте может закодировать первые 4 бита символа Unicode. Получается <strong>4 + 6 + 6 = 16</strong> байт. Выходит, что UTF-8 может иметь либо 2, либо 3 байта на символ Unicode (один не может, так как нет надобности кодировать 6 бит (8 &#8212; 2 бита &#8217;10&#8242;) &#8212; они будут ASCII символом. Именно поэтому первый байт UTF-8 никогда не может начинаться с &#8217;10&#8242;).</p>
<h2>Заключение</h2>
<p>Кстати, благодаря такой кодировке, можно взять любой байт в потоке, и определить: является ли байт Unicode символом (если 7-ой бит &#8212; значит не ASCII), если да, то первый ли он в потоке UTF-8 или не первый (если &#8217;10&#8242;, значит не первый), если не первый, то мы можем переместиться назад побайтово, чтобы найти первый код UTF-8 (у которого 6-ой бит будет 1), либо переместится вправо и пропустить все &#8217;10&#8242; байты, чтобы найти следующий символ. Благодаря такой кодировке, программы также могут, не зная Unicode, считать, сколько символов в строке (на основании первого байта UTF-8 вычислить длину символа в байтах). Вообщем, если подумать, кодировка UTF-8 придумана очень грамотно, и в то же время очень эффективно.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.perlover.com/2009/11/10/easy-about-utf8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

