<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
	>
<channel>
	<title>Comments on: А как насчёт скрестить UTF-8 и Win32 API?</title>
	<atom:link href="http://blog.not-a-kernel-guy.com/2007/06/03/193/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.not-a-kernel-guy.com/2007/06/03/193</link>
	<description>... in the Windows kernel team</description>
	<pubDate>Thu, 08 Jan 2009 13:26:42 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Not a kernel guy : Blog Archive : Win32.Utf8.</title>
		<link>http://blog.not-a-kernel-guy.com/2007/06/03/193/comment-page-1#comment-8187</link>
		<dc:creator>Not a kernel guy : Blog Archive : Win32.Utf8.</dc:creator>
		<pubDate>Mon, 13 Aug 2007 05:40:39 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/06/03/193#comment-8187</guid>
		<description>[...] тут совсем недавно удивлялся почему нет библиотек, эмулирующих поддержку UTF-8 на [...]</description>
		<content:encoded><![CDATA[<p>[...] тут совсем недавно удивлялся почему нет библиотек, эмулирующих поддержку UTF-8 на [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy</title>
		<link>http://blog.not-a-kernel-guy.com/2007/06/03/193/comment-page-1#comment-7981</link>
		<dc:creator>Not a kernel guy</dc:creator>
		<pubDate>Thu, 07 Jun 2007 05:04:16 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/06/03/193#comment-7981</guid>
		<description>Да я согласная, согласная я. :-) За исключением ремарки про UCS-4. UTF-16 тоже не способна закодировать всё многообразие UCS-4. 

Моя мысль состоит в том, что при переделки ANSI проекта в Unicode в случае UTF-16 делается двойная работа - сначала все переводится на UCS-2, а потом, когда обнаруживается, что UCS-2 и UTF-16 это не одно и тоже, начинаются заделываться дырки с surrogate characters. И это если не затрагивать символов вроде ударений и прочих, имеющих культурно/лингвистическое значение. 

В случае же с UTF-8 массу усилий, которые в "нормальном" случае тратяться на героическую замену strlen на wstrlen (а по уму - сразу на StringCchLength), можно потратить на искоренение "лингвистисеких" проблем.

В общем, нехорошо маскировать проблему и говорить, что мы, мол, поддерживаем весь Unicode, хотя на самом деле поддерживаются дай бог только европейские языки.</description>
		<content:encoded><![CDATA[<p>Да я согласная, согласная я. <img src='http://blog.not-a-kernel-guy.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> За исключением ремарки про UCS-4. UTF-16 тоже не способна закодировать всё многообразие UCS-4. </p>
<p>Моя мысль состоит в том, что при переделки ANSI проекта в Unicode в случае UTF-16 делается двойная работа - сначала все переводится на UCS-2, а потом, когда обнаруживается, что UCS-2 и UTF-16 это не одно и тоже, начинаются заделываться дырки с surrogate characters. И это если не затрагивать символов вроде ударений и прочих, имеющих культурно/лингвистическое значение. </p>
<p>В случае же с UTF-8 массу усилий, которые в &#8220;нормальном&#8221; случае тратяться на героическую замену strlen на wstrlen (а по уму - сразу на StringCchLength), можно потратить на искоренение &#8220;лингвистисеких&#8221; проблем.</p>
<p>В общем, нехорошо маскировать проблему и говорить, что мы, мол, поддерживаем весь Unicode, хотя на самом деле поддерживаются дай бог только европейские языки.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Eugene Golushkov</title>
		<link>http://blog.not-a-kernel-guy.com/2007/06/03/193/comment-page-1#comment-7978</link>
		<dc:creator>Eugene Golushkov</dc:creator>
		<pubDate>Wed, 06 Jun 2007 20:48:41 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/06/03/193#comment-7978</guid>
		<description>Сколько разных программистов, зная что в тексте ровно N байт выделяют для смены кодировки буфер размером 2*N , в неявном предположении, что при конвертации объем не может увеличиться больше чем в два раза? При этом число 2 скорее всего замаскировано чем-то вроде sizeof(wchar_t), если программист знает, что на Unix-ах wchar_t четырехбайтный. И большинство кодировок (все single-byte) вполне отвечают этому эмпирическому правилу, что позволяет таким ошибкам жить в коде, которому уже довольно много лет. 

Так что мы имеем два отрицательных момента. Первый состоит в том, что программисту нужно быть много аккуратнее в управлении памятью при добавлении поддержки UTF-8, так как максимальный размер символа может достигать 6-ти байт для UCS-4,  4-х байт для UTF-16 и 3-х байт для Basic Multilingual Plane. В сравнении с этим правила UTF-16 просты до безобразия - 2 байта для Basic Multilingual Plane и 4 байта для азиатских языков.

Второй отрицательный момент в том, что для того, чтобы сделать что-либо полезное с текстом, будь то сортировка или отрисовка - внутри runtime (в широком смысле) все равно нужно будет получить code-point, что для UTF-8 более затратная операция.

Ну и в качестве курьеза, который показывает, что за аргументацией Майкла Каплана возможно стоит нечто большее, чем абстрактные рассуждения. Google для запроса "utf-16 problem" находит 380 000 ссылок, а для "utf-8 problem" - 5 900 000. Разница более чем в 15 раз :)</description>
		<content:encoded><![CDATA[<p>Сколько разных программистов, зная что в тексте ровно N байт выделяют для смены кодировки буфер размером 2*N , в неявном предположении, что при конвертации объем не может увеличиться больше чем в два раза? При этом число 2 скорее всего замаскировано чем-то вроде sizeof(wchar_t), если программист знает, что на Unix-ах wchar_t четырехбайтный. И большинство кодировок (все single-byte) вполне отвечают этому эмпирическому правилу, что позволяет таким ошибкам жить в коде, которому уже довольно много лет. </p>
<p>Так что мы имеем два отрицательных момента. Первый состоит в том, что программисту нужно быть много аккуратнее в управлении памятью при добавлении поддержки UTF-8, так как максимальный размер символа может достигать 6-ти байт для UCS-4,  4-х байт для UTF-16 и 3-х байт для Basic Multilingual Plane. В сравнении с этим правила UTF-16 просты до безобразия - 2 байта для Basic Multilingual Plane и 4 байта для азиатских языков.</p>
<p>Второй отрицательный момент в том, что для того, чтобы сделать что-либо полезное с текстом, будь то сортировка или отрисовка - внутри runtime (в широком смысле) все равно нужно будет получить code-point, что для UTF-8 более затратная операция.</p>
<p>Ну и в качестве курьеза, который показывает, что за аргументацией Майкла Каплана возможно стоит нечто большее, чем абстрактные рассуждения. Google для запроса &#8220;utf-16 problem&#8221; находит 380 000 ссылок, а для &#8220;utf-8 problem&#8221; - 5 900 000. Разница более чем в 15 раз <img src='http://blog.not-a-kernel-guy.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy</title>
		<link>http://blog.not-a-kernel-guy.com/2007/06/03/193/comment-page-1#comment-7969</link>
		<dc:creator>Not a kernel guy</dc:creator>
		<pubDate>Wed, 06 Jun 2007 04:37:07 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/06/03/193#comment-7969</guid>
		<description>Не могу сказать что аргументы Майкла звучат убедительно. По моему, всё что он сказал это то, что проекты использующие UTF-16 поддерживают Unicode лучше чем UTF-8 аналоги только потому, что и там и там разработчики лажают с поддержкой многосимвольных последовательностей. Просто в один символ UTF-16 можно запихать гораздо больше разных кодировок, чем в в один символ UTF-8.</description>
		<content:encoded><![CDATA[<p>Не могу сказать что аргументы Майкла звучат убедительно. По моему, всё что он сказал это то, что проекты использующие UTF-16 поддерживают Unicode лучше чем UTF-8 аналоги только потому, что и там и там разработчики лажают с поддержкой многосимвольных последовательностей. Просто в один символ UTF-16 можно запихать гораздо больше разных кодировок, чем в в один символ UTF-8.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Eugene Golushkov</title>
		<link>http://blog.not-a-kernel-guy.com/2007/06/03/193/comment-page-1#comment-7968</link>
		<dc:creator>Eugene Golushkov</dc:creator>
		<pubDate>Tue, 05 Jun 2007 13:46:13 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/06/03/193#comment-7968</guid>
		<description>О поддержке UTF-8 в реальных проектах, которые рождались как ANSI великолепно написал Michael Caplan здесь http://blogs.msdn.com/michkap/archive/2007/05/11/2547703.aspx 
Он описывает нюансы, приведшие к прекращению поддержки UTF-8 в VCRT 8.0, и, насколько я понимаю, все доводы применимы и к MSLU. 

Цитата: But to be honest, given that every project I have ever seen that claimed to support UTF-8 failed in the 3/4 byte cases (some even failed in the 2-byte cases!) 

А еще нужно учесть, что длина UTF-8 представления символа из UCS-4 может быть до 6 байт (для code points за пределами первых 17 плоскостей, rfc2279).</description>
		<content:encoded><![CDATA[<p>О поддержке UTF-8 в реальных проектах, которые рождались как ANSI великолепно написал Michael Caplan здесь <a href="http://blogs.msdn.com/michkap/archive/2007/05/11/2547703.aspx" rel="nofollow">http://blogs.msdn.com/michkap/archive/2007/05/11/2547703.aspx</a><br />
Он описывает нюансы, приведшие к прекращению поддержки UTF-8 в VCRT 8.0, и, насколько я понимаю, все доводы применимы и к MSLU. </p>
<p>Цитата: But to be honest, given that every project I have ever seen that claimed to support UTF-8 failed in the 3/4 byte cases (some even failed in the 2-byte cases!) </p>
<p>А еще нужно учесть, что длина UTF-8 представления символа из UCS-4 может быть до 6 байт (для code points за пределами первых 17 плоскостей, rfc2279).</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Not a kernel guy</title>
		<link>http://blog.not-a-kernel-guy.com/2007/06/03/193/comment-page-1#comment-7959</link>
		<dc:creator>Not a kernel guy</dc:creator>
		<pubDate>Mon, 04 Jun 2007 18:33:37 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/06/03/193#comment-7959</guid>
		<description>&#160;&lt;blockquote&gt;Некоторые из стандартных Windows функций имеют UTF-8 overload-ы.&lt;/blockquote&gt;

Интересно, не знал об этом.</description>
		<content:encoded><![CDATA[<p>&nbsp;<br />
<blockquote>Некоторые из стандартных Windows функций имеют UTF-8 overload-ы.</p></blockquote>
<p>Интересно, не знал об этом.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: кирилл</title>
		<link>http://blog.not-a-kernel-guy.com/2007/06/03/193/comment-page-1#comment-7955</link>
		<dc:creator>кирилл</dc:creator>
		<pubDate>Mon, 04 Jun 2007 12:25:38 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/06/03/193#comment-7955</guid>
		<description>Некоторые из стандартных Windows функций имеют UTF-8 overload-ы. Например - DNS функции. Загляните в список экспорта из DNSAPI.DLL и сможете увидеть например такое:
DnsValidateName_A
DnsValidateName_UTF8
DnsValidateName_W</description>
		<content:encoded><![CDATA[<p>Некоторые из стандартных Windows функций имеют UTF-8 overload-ы. Например - DNS функции. Загляните в список экспорта из DNSAPI.DLL и сможете увидеть например такое:<br />
DnsValidateName_A<br />
DnsValidateName_UTF8<br />
DnsValidateName_W</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Александр</title>
		<link>http://blog.not-a-kernel-guy.com/2007/06/03/193/comment-page-1#comment-7954</link>
		<dc:creator>Александр</dc:creator>
		<pubDate>Mon, 04 Jun 2007 10:23:32 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/06/03/193#comment-7954</guid>
		<description>А я уже сделал. 
Очень просто - создал клон класса CString (очень старый, от VC++ 4.0), выкинув из него двухбайтовость и левую многобайтность. Все хранение в однобайтном буфере (т.е. char *) строки UTF-8. Разумеется, конструкторы из CString и переопределенное присваивание.

Я не стал переделывать системные вызовы. Везде, где надо, я в мои классы добавляю временную переменную типа CString, а в вызове делаю SomeStr.ToStr(cstr).
Разумеется, это не так удобно, как обертывание всего API, но работает зашибись.
К примеру, я смог использовать xgettext для интернационализации своих программ, что на порядок круче отстоя с интернационализацией ресурсов.
Теперь языки у меня переключаются динамически прямо в запущенной программе, из меню.

Производительность не пострадала - т.е. я не заметил тормозов. Хотя специально не замерял.</description>
		<content:encoded><![CDATA[<p>А я уже сделал.<br />
Очень просто - создал клон класса CString (очень старый, от VC++ 4.0), выкинув из него двухбайтовость и левую многобайтность. Все хранение в однобайтном буфере (т.е. char *) строки UTF-8. Разумеется, конструкторы из CString и переопределенное присваивание.</p>
<p>Я не стал переделывать системные вызовы. Везде, где надо, я в мои классы добавляю временную переменную типа CString, а в вызове делаю SomeStr.ToStr(cstr).<br />
Разумеется, это не так удобно, как обертывание всего API, но работает зашибись.<br />
К примеру, я смог использовать xgettext для интернационализации своих программ, что на порядок круче отстоя с интернационализацией ресурсов.<br />
Теперь языки у меня переключаются динамически прямо в запущенной программе, из меню.</p>
<p>Производительность не пострадала - т.е. я не заметил тормозов. Хотя специально не замерял.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Зеркало: Not a kernel guy</title>
		<link>http://blog.not-a-kernel-guy.com/2007/06/03/193/comment-page-1#comment-7952</link>
		<dc:creator>Зеркало: Not a kernel guy</dc:creator>
		<pubDate>Mon, 04 Jun 2007 00:20:12 +0000</pubDate>
		<guid isPermaLink="false">http://blog.not-a-kernel-guy.com/2007/06/03/193#comment-7952</guid>
		<description>&lt;strong&gt;А как насчёт скрестить UTF-8 и Win32 API?...&lt;/strong&gt;

Пришла давеча в голову совсем неоригинальная мысль – а почему ещё никто не сдела...</description>
		<content:encoded><![CDATA[<p><strong>А как насчёт скрестить UTF-8 и Win32 API?&#8230;</strong></p>
<p>Пришла давеча в голову совсем неоригинальная мысль – а почему ещё никто не сдела&#8230;</p>
]]></content:encoded>
	</item>
</channel>
</rss>
