<?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>Wil Tan &#187; unicode</title>
	<atom:link href="http://dready.org/blog/category/unicode/feed/" rel="self" type="application/rss+xml" />
	<link>http://dready.org/blog</link>
	<description>musings on internationalized identifiers: domain names, OpenID, TLDs</description>
	<lastBuildDate>Sat, 10 Jul 2010 10:11:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Emoji Encoding Conversion between Carriers</title>
		<link>http://dready.org/blog/2009/02/01/emoji-encoding-conversion/</link>
		<comments>http://dready.org/blog/2009/02/01/emoji-encoding-conversion/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 17:52:05 +0000</pubDate>
		<dc:creator>wil</dc:creator>
				<category><![CDATA[japan]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[emoji]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://dready.org/blog/?p=215</guid>
		<description><![CDATA[
I remember reading about Apple supporting emoji on the iPhone OS 2.2. Now that I&#8217;ve upgraded, I decided to try it out but for could never find it after hunting through the keyboard preferences. Googling showed that these cute little emoticons are only available for Softbank users. Thankfully, Steven Troughton-Smith has figured out that by [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.macrumors.com/iphone/2008/10/05/iphone-2-2-includes-hidden-japanese-emoji-icons/"><img src="http://dready.org/blog/wp-content/uploads/2009/02/175357-emoji.jpg" alt="" title="emoji on iPhone" width="320" height="480" class="alignnone size-medium wp-image-216" /></a></p>
<p>I remember reading about Apple supporting <a href="http://dready.org/blog/2009/01/30/emoji-in-unicode/">emoji</a> on the iPhone OS 2.2. Now that I&#8217;ve upgraded, I decided to try it out but for could never find it after hunting through the keyboard preferences. Googling showed that these cute little emoticons are only available for Softbank users. Thankfully, <a href="http://blog.steventroughtonsmith.com/2008/11/how-to-enable-emoji-systemwide.html">Steven Troughton-Smith</a> has figured out that by editing a file on your iPhone backup, the &#8220;emoji&#8221; option suddenly shows up under <em>Settings</em> -&gt; <em>General</em> -&gt; <em>Keyboard</em> -&gt; <em>International Keyboards</em> -&gt; <em>Japanese</em>!</p>
<p>Now that I have the ability to enter these emoji on my iPhone, I figure I&#8217;d try it out by sending an email to myself. Alas, all I get is a list of of boxes. Time to look at the message content (relevant fields):</p>
<p><span id="more-215"></span></p>
<pre>
Content-Type: text/plain;
  charset=cp932;
  format=flowed
Content-Transfer-Encoding: base64
X-Mailer: iPhone Mail (5G77)
Mime-Version: 1.0 (iPhone Mail 5G77)
Subject: trying out emoji
Date: Sat, 31 Jan 2009 19:11:03 +0800

aGV5IHRoZXJlIPGQDQoNCvWc9d3wSPB78unzR/SY9Jv3RPCW9vnwlQ==
</pre>
<p>ok, pretty strange that it&#8217;s sent in <a href="http://en.wikipedia.org/wiki/Code_page_932">cp932</a> encoding, but we&#8217;ll see:</p>
<pre>
&gt;&gt;&gt; from base64 import b64decode
&gt;&gt;&gt; s = b64decode('aGV5IHRoZXJlIPGQDQoNCvWc9d3wSPB78unzR/SY9Jv3RPCW9vnwlQ==')
&gt;&gt;&gt; s
'hey there \xf1\x90\r\n\r\n\xf5\x9c\xf5\xdd\xf0H\xf0{\xf2\xe9\xf3G\xf4\x98\xf4\x9b\xf7D\xf0\x96\xf6\xf9\xf0\x95'
&gt;&gt;&gt; s.decode('cp932')
u'hey there \ue10b\r\n\r\n\ue407\ue448\ue008\ue03b\ue220\ue23b\ue347\ue34a\ue528\ue055\ue520\ue054'
&gt;&gt;&gt;
</pre>
<p>The Unicode code points look like they do correspond to the Softbank private use ones, so I&#8217;m going to use the <a href="http://code.google.com/p/emoji4unicode/">emoji4unicode</a> package to convert it to HTML. The following Python script will convert it to the various carrier&#8217;s representation:</p>
<pre>
import emoji4unicode
import carrier_data

s = b64decode('aGV5IHRoZXJlIPGQDQoNCvWc9d3wSPB78unzR/SY9Jv3RPCW9vnwlQ==')
uni = s.decode('cp932')

sd = carrier_data.GetSoftbankData()
dd = carrier_data.GetDocomoData()
kd = carrier_data.GetKddiData()

emoji4unicode.Load()
def find_symbol(pua, carrier):
    for sym in emoji4unicode.GetSymbols():
        uni = sym.GetCarrierUnicode(carrier)
        if uni and uni == pua:
            return sym

def map_symbol(sym, carrier, cdata):
    uni = sym.GetCarrierUnicode(carrier)
    if not uni: # no mapping for this carrier
        return sym.GetTextFallback()
    else:
        if uni.startswith("&gt;"): # mapped
            if len(uni) &gt; 5:
                raise Exception, "cannot handle this yet"
            uni = uni[1:]

        return cdata.SymbolFromUnicode(uni).ImageHTML()

softbank = []
docomo = []
kddi = []

for u in uni:
    hex = "%04X" % ord(u)
    if u &gt; '\x7F':
        sym = find_symbol(hex, "softbank")

        softbank.append(sd.SymbolFromUnicode(hex).ImageHTML())
        kddi.append(map_symbol(sym, "kddi", kd))
        docomo.append(map_symbol(sym, "docomo", dd))
    elif u == '\n':
        softbank.append('&lt;br /&gt;')
        kddi.append('&lt;br /&gt;')
        docomo.append('&lt;br /&gt;')
    else:
        softbank.append(u)
        kddi.append(u)
        docomo.append(u)

print "Softbank:&lt;br /&gt;", ''.join(softbank).encode('utf-8')
print "&lt;hr /&gt;KDDI:&lt;br /&gt;", ''.join(kddi).encode('utf-8')
print "&lt;hr /&gt;DoCoMo:&lt;br /&gt;", ''.join(docomo).encode('utf-8')
</pre>
<p>Results below:</p>
<div style="background: #333">
<strong>Softbank</strong>:<br /> hey there <img src=http://creation.mb.softbank.jp/web/img/E101/E10B_20.gif></p>
<p><img src=http://creation.mb.softbank.jp/web/img/E401/E407_20.gif><img src=http://creation.mb.softbank.jp/web/img/E401/E448_20.gif><img src=http://creation.mb.softbank.jp/web/img/E001/E008_20.gif><img src=http://creation.mb.softbank.jp/web/img/E001/E03B_20.gif><img src=http://creation.mb.softbank.jp/web/img/E201/E220_20.gif><img src=http://creation.mb.softbank.jp/web/img/E201/E23B_20.gif><img src=http://creation.mb.softbank.jp/web/img/E301/E347_20.gif><img src=http://creation.mb.softbank.jp/web/img/E301/E34A_20.gif><img src=http://creation.mb.softbank.jp/web/img/E501/E528_20.gif><img src=http://creation.mb.softbank.jp/web/img/E001/E055_20.gif><img src=http://creation.mb.softbank.jp/web/img/E501/E520_20.gif><img src=http://creation.mb.softbank.jp/web/img/E001/E054_20.gif>
</div>
<div style="background: #333">
<strong>KDDI</strong>:<br /> hey there <img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/254.gif></p>
<p><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/444.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/489.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/94.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/342.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/184.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/5.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/243.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/437.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/249.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/252.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/713.gif><img src=http://www001.upp.so-net.ne.jp/hdml/emoji/e/246.gif>
</div>
<div style="background: #333">
<strong>DoCoMo</strong>:<br /> hey there <img src=http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/extention/images/74.gif width=16 height=16></p>
<p><img src=http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/basic/images/143.gif width=16 height=16>[サンタ]<img src=http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/basic/images/68.gif width=16 height=16><img src=http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/extention/images/53.gif width=16 height=16><img src=http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/basic/images/129.gif width=16 height=16>[<][イチゴ][ナス][サル]<img src=http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/extention/images/69.gif width=16 height=16>[イルカ][クジラ]
</div>
<p>As you can see, DoCoMo has the least number of emoji&#8217;s, so many of the characters like &#8220;Santa&#8221;, &#8220;Strawberry&#8221;, &#8220;Eggplant&#8221;, &#8220;Monkey&#8221;, &#8220;Dolphin&#8221; and &#8220;Whale&#8221; are substituted by the fallback text format.</p>
<p>Do note that the python script is not optimized at all, and loops through every emoji in the database for each character it needs to convert. Also, if you need such functionality in your application, there are various libraries out there that already does the mapping well. This is just an experiment.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://dready.org/blog/2009/02/01/emoji-encoding-conversion/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Emoji to be encoded in Unicode</title>
		<link>http://dready.org/blog/2009/01/30/emoji-in-unicode/</link>
		<comments>http://dready.org/blog/2009/01/30/emoji-in-unicode/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 16:48:46 +0000</pubDate>
		<dc:creator>wil</dc:creator>
				<category><![CDATA[japan]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[emoji]]></category>
		<category><![CDATA[i18n]]></category>

		<guid isPermaLink="false">http://dready.org/blog/?p=208</guid>
		<description><![CDATA[The Unicode Technical Committee is working on encoding emoji (絵文字) in the Unicode Standard and ISO10646. It has spurred loads of discussions on the Unicode mailing list with more than a handful of forked threads, leading to fundamental questions like whether we should even encode them, and what constitutes a character.
Not to worry, the Unicode [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>The Unicode Technical Committee is working on encoding <a href="http://en.wikipedia.org/wiki/Emoji">emoji</a> (絵文字) in the Unicode Standard and ISO10646. It has spurred loads of discussions on the <a href="http://www.unicode.org/cgi-bin/CurrentArchive.pl">Unicode mailing list</a> with more than a handful of forked threads, leading to fundamental questions like whether we should even encode them, and what constitutes a character.</p>
<p>Not to worry, the Unicode consortium is a veteran when it comes to dealing with the hairy issues of creating standards that work across languages, cultures and geographic regions. They simply can&#8217;t please everyone.</p>
<p>To me, the motivation for this is clear &#8212; interoperability. The current state of affairs in the Japanese mobile industry leaves a lot to be desired: across the carriers, there exist different sets of supported emoji&#8217;s, different private-use characters, substitution mappings, and code pages (user-defined characters in Shift_JIS, really). As one can imagine, the results is chaos, and as I software engineer, I really don&#8217;t want to imagine what those poor software engineers have to do to make it &#8220;just work&#8221; when a message cross the carrier boundaries.</p>
<p>To illustrate my point, let&#8217;s look at what Google does when you send a message with some emoji characters from GMail to each of DoCoMo, Softbank, and au.</p>
<p><a href="http://dready.org/blog/wp-content/uploads/2009/01/gmail-emoji.png"><img src="http://dready.org/blog/wp-content/uploads/2009/01/gmail-emoji.png" alt="" title="Emoji experiment on GMail" width="500" height="580" class="alignnone size-full wp-image-209" /></a></p>
<p><span id="more-208"></span></p>
<p>The screenshot above is for DoCoMo, but I also repeated the experiment for Softbank and au. From the bounce message, one can easily tell that what is saved as a sent message and what gets actually transmitted to each of the carriers&#8217; SMTP server are all distinct in their encodings.</p>
<p>What&#8217;s saved in Gmail when you click on &#8220;Show original&#8221; embeds the graphics using standard mime techniques (<code>multipart/related</code> with CID URIs a.k.a <a href="https://www.ietf.org/rfc/rfc2111.txt">RFC 2111</a>) with an extension attribute called <em>goomoji</em> in the HTML version, which carries part of Unicode private use character assigned for it. For example, the crab <img src="https://mail.google.com/mail/e/1E3" alt="crab [カニ]" /> is assigned <code>U+FE1E3</code> in Google, so its <code>goomoji</code> value is <code>1E3</code>.</p>
<p>What&#8217;s sent to DoCoMo is a different story altogether:</p>
<p>It&#8217;s a standard <code>multipart/alternative</code> message with 2 parts: <code>text/plain</code> and <code>text/html</code>, both encoded in Shift_JIS. Decoding the <code>text/plain</code> part gives:</p>
<pre>
&gt;&gt;&gt; import base64
&gt;&gt;&gt; sjis = base64.b64decode("W4NKg2pd+aT56ApYT1hPIIFfKF4tXimBXgoKaHR0cDovL3hyaS5uZXQvPXdpbAo=")
&gt;&gt;&gt; sjis
'[\x83J\x83j]\xf9\xa4\xf9\xe8\nXOXO \x81_(^-^)\x81^\n\nhttp://xri.net/=wil\n'
&gt;&gt;&gt; print sjis.decode("shift_jis", 'ignore')
[カニ]
XOXO ＼(^-^)／

http://xri.net/=wil
</pre>
<p>Since DoCoMo doesn&#8217;t have the <a href="http://en.wikipedia.org/wiki/Decapoda">decapods</a> in their emoji set, it gets encoded as <a href="http://www.unicode.org/~scherer/emoji4unicode/snapshot/full.html#e-1E3">カニ (Japanese for crab) in square brackets</a>. Next comes the double musical notes <a href="http://www.unicode.org/~scherer/emoji4unicode/snapshot/full.html#e-814"><img src="https://mail.google.com/mail/e/814" alt="musical notes メロディ" /></a>, which is assigned a user defined Shift_JIS value of F9A4 in DoCoMo (explains why I had to pass the &#8216;ignore&#8217; parameter to the decode method above, Python has no way to map that that sequence to Unicode and therefore barfs). Same goes for the tulip <img src="https://mail.google.com/mail/e/03D" alt="Tulip チューリップ" />. Ignoring the plain text &#8220;XOXO&#8221;, the last emoticon is a <em>hug face</em> <img src="https://mail.google.com/mail/e/35D" alt="hug face emoticon ＼(^-^)／" />, which <a href="http://www.unicode.org/~scherer/emoji4unicode/snapshot/full.html#e-35D">Google assigned a code point to</a> but none of the carriers use a graphic to represent. In fact, this is mapped to a Kao-moji (顔文字 &#8211; &#8220;face words&#8221;).</p>
<p>For au (KDDI), the message was also sent in <code>multipart/alternative</code> with  <code>text/plain</code> and <code>text/html</code> parts but this time encoded in ISO-2022-JP. Similar situation here, where crab =&gt; [カニ], KDDI&#8217;s version of ISO-2022-JP for the musical notes and tulip emoji, and kaomoji for the hugs.</p>
<p>Similar deal for Softbank, but the <code>charset</code> specified is <code>PDC</code>, but it smells just like Shift_JIS with user-defined characters to me.</p>
<p>I hope by now you have an appreciation of the kind of fiddling that Google engineers had to do in order to get their messages to display properly on Japanese mobile phones, just because the carriers decided to go invent their own mappings and character sets. It&#8217;s no wonder that <a href="http://google-opensource.blogspot.com/2008/11/emoji-for-unicode-open-source-data-for.html">Google</a> and Apple, with its recently announced emoji support in iPhone, are among those supporting this effort.</p>
<p>The ongoing work can be found <a href="http://sites.google.com/site/unicodesymbols/Home/emoji-symbols">here</a> and all the emoji&#8217;s is available <a href="http://www.unicode.org/%7Escherer/emoji4unicode/snapshot/utc.html">here</a> and <a href="http://www.unicode.org/%7Escherer/emoji4unicode/snapshot/full.html">here</a> in gory details.</p>
<p>If I had the time and luxury (read: paid) to participate, I would. I wish them all the best and hope to see a good set of emoji&#8217;s in Unicode soon.</p>


<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://dready.org/blog/2009/01/30/emoji-in-unicode/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Python 3.0: Text vs. Data Instead Of Unicode vs. 8-bit</title>
		<link>http://dready.org/blog/2008/12/15/python-30-text-vs-data-instead-of-unicode-vs-8-bit/</link>
		<comments>http://dready.org/blog/2008/12/15/python-30-text-vs-data-instead-of-unicode-vs-8-bit/#comments</comments>
		<pubDate>Sun, 14 Dec 2008 17:26:58 +0000</pubDate>
		<dc:creator>wil</dc:creator>
				<category><![CDATA[i18n]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://dready.org/blog/?p=188</guid>
		<description><![CDATA[Python 3.0 (Py3K) is out. I&#8217;m with Sam Ruby &#8212; this seemingly simple change of paradigm from &#8220;Unicode vs. 8-bit&#8221; to &#8220;Text vs. Data&#8221; is a breath of fresh air.
What&#8217;s inconsistent in this new version though is that the new bytes type still contains many of the methods with text semantics that should only make [...]


Related posts:<ol><li><a href='http://dready.org/blog/2009/10/09/tornado-with-virtualenv-and-pip-quickstart/' rel='bookmark' title='Permanent Link: Tornado with VirtualEnv and Pip Quickstart'>Tornado with VirtualEnv and Pip Quickstart</a> <small>Friendfeed&#8217;s open source Tornado web server is great, and is incredibly easy to get up-and-running. Just install tornado, write your...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.python.org/download/releases/3.0/">Python 3.0</a> (Py3K) is out. I&#8217;m with <a href="http://intertwingly.net/blog/2008/12/04/Python-3-0-Released">Sam Ruby</a> &#8212; this seemingly simple change of paradigm<a href="http://docs.python.org/dev/3.0/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit"> from &#8220;Unicode vs. 8-bit&#8221; to &#8220;Text vs. Data&#8221;</a> is a breath of fresh air.</p>
<p>What&#8217;s inconsistent in this new version though is that the new <code>bytes</code> type still contains many of the methods with text semantics that should only make sense as <code>string</code> methods: e.g. <code>capitalize()</code> and <code>islower()</code>. I suspect these are provided as convenience methods, which is fine. But one would imagine that these byte methods will work by decoding the bytes using the default encoding of your locale, then performing the operations on the resulting string. As it turns out from my trials, it seems to assume that your bytes are encoded in Latin1:</p>
<p><code><br />
&gt;&gt;&gt; greek_beta = "Β" # This is the uppercase greek letter "beta", not regular B.<br />
&gt;&gt;&gt; greek_beta.isupper()<br />
True<br />
&gt;&gt;&gt; greek_beta.islower()<br />
False<br />
&gt;&gt;&gt; greek_beta.lower()<br />
'β'<br />
&gt;&gt;&gt; greek_beta_bytes = greek_beta.encode('iso8859-7')<br />
&gt;&gt;&gt; greek_beta_bytes<br />
b'\xc2'<br />
&gt;&gt;&gt; greek_beta_bytes.isupper()<br />
False<br />
&gt;&gt;&gt; greek_beta_bytes.islower()<br />
False<br />
&gt;&gt;&gt; greek_beta_bytes.lower()<br />
b'\xc2'<br />
&gt;&gt;&gt; greek_beta_bytes.upper()<br />
b'\xc2'<br />
</code></p>
<p>This is definitely a gotcha that may lead to hard to find bugs. So, it is best to avoid using those methods on <code>bytes</code> objects.</p>
<p>Otherwise, this change is definitely more &#8220;correct&#8221; in that Py3K forces you to know the type of your variables earlier or at the interfaces (to the outside world) so errors like these are less likely to sneak up from your back. For example, you can no longer use the <code>+</code> (sequence concatenation operator) to mix text and data. Whereas in Python 2.x, you can do:</p>
<p><code><br />
&gt;&gt;&gt; name = 'Wil'<br />
&gt;&gt;&gt; greet = lambda n: u'Hello ' + n<br />
&gt;&gt;&gt; greet(name)<br />
u'Hello Wil'<br />
&gt;&gt;&gt; name = u'François'.encode('utf-8')<br />
&gt;&gt;&gt; name<br />
'Fran\xc3\xa7ois'<br />
&gt;&gt;&gt; greet(name)<br />
Traceback (most recent call last):<br />
  File "&lt;stdin&gt;", line 1, in &lt;module&gt;<br />
  File "&lt;stdin&gt;", line 1, in &lt;lambda&gt;<br />
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)<br />
</code></p>
<p><small>What went wrong was that you&#8217;re relying on Python&#8217;s automatic Unicode conversion, which uses the standard ASCII codec (which is a good thing) to promote your <code>str</code> to <code>unicode</code>.</small></p>
<p>In Python 3.x, you will be greeted by the <code><a href="http://docs.python.org/dev/3.0/library/exceptions.html#exceptions.TypeError">TypeError</a>: Can't convert 'bytes' object to str implicitly</code> message if you tried to pass a <code>bytes</code> object to the function. This will happen on any bytes object, so the error is easier to catch.</p>
<p>In this new version, the <a href="http://docs.python.org/dev/3.0/library/unicodedata.html"><code>unicodedata</code></a> module is upgraded to Unicode version 5.1.0.</p>
<p>Now, I&#8217;m not ready to run production code on Py3K yet but it would be nice if Django (my favourite Python-based web framework) can run on it. It looks like <a href="http://loewis.de/martin/">Martin von Löwis</a> has started the <a href="http://wiki.python.org/moin/PortingDjangoTo3k" title="Porting Django to Python 3.0 (Py3K)">porting</a>.</p>


<p>Related posts:<ol><li><a href='http://dready.org/blog/2009/10/09/tornado-with-virtualenv-and-pip-quickstart/' rel='bookmark' title='Permanent Link: Tornado with VirtualEnv and Pip Quickstart'>Tornado with VirtualEnv and Pip Quickstart</a> <small>Friendfeed&#8217;s open source Tornado web server is great, and is incredibly easy to get up-and-running. Just install tornado, write your...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://dready.org/blog/2008/12/15/python-30-text-vs-data-instead-of-unicode-vs-8-bit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
