<?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>OddPoet&#039;s βetalog</title>
	<atom:link href="http://oddpoet.net/feed" rel="self" type="application/rss+xml" />
	<link>http://oddpoet.net</link>
	<description>디지털과 아나로그의 경계에 서서...</description>
	<lastBuildDate>Mon, 12 Jul 2010 20:34:27 +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>RVM : Ruby Version Manager</title>
		<link>http://oddpoet.net/archives/217</link>
		<comments>http://oddpoet.net/archives/217#comments</comments>
		<pubDate>Mon, 12 Jul 2010 20:34:27 +0000</pubDate>
		<dc:creator>OddPoet</dc:creator>
				<category><![CDATA[개발]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RVM]]></category>

		<guid isPermaLink="false">http://oddpoet.net/?p=217</guid>
		<description><![CDATA[간만에 다시 Ruby를 가지고 놀고 있습니다.
1.9.x 버전에서 달라진 부분도 있고해서 macport로 1.9.1버전을 설치하는데 컴파일 오류가 나더군요.
구글링 결과 openssl 업데이트와 관련된 문제임을 파악했으나, 공식 패치버전이 macport  repository에 올라오는데 몇 일은 걸릴 것 같더군요.
다른 대안을 찾다가 RVM(Ruby Version Manager)라는 멋진 녀석을 찾았습니다.
당분간 1.8.x, 1.9.x 사이를 오가면서 놀텐데 RVM으로 각 루비 버전들을 설치 및 관리하면 편할 것 [...]]]></description>
			<content:encoded><![CDATA[<p>간만에 다시 Ruby를 가지고 놀고 있습니다.<br />
1.9.x 버전에서 달라진 부분도 있고해서 macport로 1.9.1버전을 설치하는데 컴파일 오류가 나더군요.<br />
구글링 결과 openssl 업데이트와 관련된 문제임을 파악했으나, 공식 패치버전이 macport  repository에 올라오는데 몇 일은 걸릴 것 같더군요.</p>
<p>다른 대안을 찾다가 <a href="http://rvm.beginrescueend.com/" onclick="pageTracker._trackPageview('/outgoing/rvm.beginrescueend.com/?referer=');">RVM(Ruby Version Manager)</a>라는 멋진 녀석을 찾았습니다.<br />
당분간 1.8.x, 1.9.x 사이를 오가면서 놀텐데 RVM으로 각 루비 버전들을 설치 및 관리하면 편할 것 같습니다.</p>
<h3> RVM 설치 </h3>
<p>설치는 매우 간단합니다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p217code5'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2175"><td class="code" id="p217code5"><pre class="text" style="font-family:monospace;">bash &lt; &lt;( curl http://rvm.beginrescueend.com/releases/rvm-install-head )</pre></td></tr></table></div>

<p>쉘에서 위와 같이 입력하고, .profile 마지막에 아래 라인을 추가해주면 됩니다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p217code6'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2176"><td class="code" id="p217code6"><pre class="text" style="font-family:monospace;">[[ -s &quot;$HOME/.rvm/scripts/rvm&quot; ]] &amp;&amp; source &quot;$HOME/.rvm/scripts/rvm&quot;</pre></td></tr></table></div>

<h3> Ruby 설치 </h3>
<p>원하는 Ruby 버전은 쉘에서 다음과 같이 입력하여 설치할 수 있습니다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p217code7'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2177"><td class="code" id="p217code7"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># MRI 1.9.1 버전 설치</span>
rvm <span style="color: #c20cb9; font-weight: bold;">install</span> 1.9.1
&nbsp;
<span style="color: #666666; font-style: italic;"># MRI 1.8.7-p160 버전 설치</span>
rvm 1.8.7-p160
&nbsp;
<span style="color: #666666; font-style: italic;"># MRI 1.8.7-p174 버전 설치</span>
rvm 1.8.7-p174  
&nbsp;
<span style="color: #666666; font-style: italic;"># JRuby 설치</span>
rvm <span style="color: #c20cb9; font-weight: bold;">install</span> jruby</pre></td></tr></table></div>

<p>패치버전 단위까지 따로 관리할 수 있고, 공식 버전(MRI), JRuby, IronRuby 등등 다양한 Ruby Interpreter를 지원합니다. </p>
<h3> 사용할 Ruby 변경하기 </h3>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p217code8'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2178"><td class="code" id="p217code8"><pre class="text" style="font-family:monospace;"># 설치된 ruby 목록 보기
rvm list
&nbsp;
# ruby 변경하기 (현재 쉘에서만)
rvm 1.9.1
&nbsp;
# 기본 ruby 변경하기
rvm 1.9.1 --default
&nbsp;
# 시스템 기본 ruby 사용하기 
rvm system --default</pre></td></tr></table></div>

<p>macport와는 별도로 ruby 패키지를 관리한다는게 썩 내키지는 않지만, 여러 버전의 ruby를 간편하게 관리하고 스위칭할 수 있으니 좋네요. 그리고 기본적으로 <em>~/.rvm/</em> 밑에 소스 및 설치파일들을 관리하기 때문에 서버에서 rvm에 의한 영향을 특정 계정으로 한정지을 수 있다는 점도 장점일 수 있겠습니다. </p>
<p>간만에 Ruby 세상으로 돌아오니 좋군요. ^^</p>

<!-- Quick Adsense Wordpress Plugin: http://techmilieu.com/quick-adsense -->
<div style="float:none;margin:10px 0 10px 0;text-align:center;">
<script type="text/javascript"><!--
google_ad_client = "pub-7051562360323491";
/* 컨텐츠하단(468x60) */
google_ad_slot = "1766915833";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>

<div style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div>]]></content:encoded>
			<wfw:commentRss>http://oddpoet.net/archives/217/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XStream에서 null값을 xml/json으로 serialize하기</title>
		<link>http://oddpoet.net/archives/192</link>
		<comments>http://oddpoet.net/archives/192#comments</comments>
		<pubDate>Wed, 14 Apr 2010 07:09:01 +0000</pubDate>
		<dc:creator>OddPoet</dc:creator>
				<category><![CDATA[개발]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[null]]></category>
		<category><![CDATA[xml serialize]]></category>
		<category><![CDATA[XStream]]></category>

		<guid isPermaLink="false">http://oddpoet.net/?p=192</guid>
		<description><![CDATA[XStream은 Java Object에 대한 xml serialize를 제공하는 Libraray입니다. 물론 deserialize도 지원하며, json 변환 역시 지원하지요. 
문제상황
하지만 XStream은 Object의 property 값이 null 인 경우에는 해당 property를 serialize 하지 않습니다. 예를 들면&#8230;


?View Code JAVA@XStreamAlias&#40;&#34;Person&#34;&#41;
class Person &#123;
	public String firstName;
	public String lastName;
	public String middleName;
&#125;
......
Person jobs = new Person&#40;&#41;;
jobs.firstName = &#34;Steve&#34;;
jobs.lastName = &#34;Jobs&#34;;
&#160;
XStream xstream = new XStream&#40;&#41;;
xstream.processAnnotations&#40;Person.class&#41;;
String xml = xstream.toXML&#40;jobs&#41;;
System.out.println&#40;xml&#41;;

위와 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://xstream.codehaus.org/" onclick="pageTracker._trackPageview('/outgoing/xstream.codehaus.org/?referer=');">XStream</a>은 Java Object에 대한 xml serialize를 제공하는 Libraray입니다. 물론 deserialize도 지원하며, json 변환 역시 지원하지요. </p>
<h3>문제상황</h3>
<p>하지만 XStream은 Object의 property 값이 null 인 경우에는 해당 property를 serialize 하지 않습니다. 예를 들면&#8230;<br />
<span id="more-192"></span></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code20'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19220"><td class="code" id="p192code20"><pre class="java" style="font-family:monospace;">@XStreamAlias<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Person&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">class</span> Person <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> firstName<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> lastName<span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> middleName<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
......
<span style="color: #006633;">Person</span> jobs <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Person<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">firstName</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Steve&quot;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">lastName</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Jobs&quot;</span><span style="color: #339933;">;</span>
&nbsp;
XStream xstream <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XStream<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
xstream.<span style="color: #006633;">processAnnotations</span><span style="color: #009900;">&#40;</span>Person.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> xml <span style="color: #339933;">=</span> xstream.<span style="color: #006633;">toXML</span><span style="color: #009900;">&#40;</span>jobs<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Asystem+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>xml<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>위와 같은 코드는 아래와 같은 XML을 출력하게 됩니다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code21'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19221"><td class="code" id="p192code21"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Person<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;firstName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Steve<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/firstName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;lastName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Jobs<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/lastName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Person<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>즉, null 값을 가진 middleName은 아예 serialize 되지 않습니다. 아마도 XStream이 Object를 deserialize 할 때 null과 공백문자열 간의 모호함을 제거하기 위해서 null을 serialize 하는 것으로 생각됩니다. (근거는 없습니다.) JSON으로 serialize 할 때도 마찬가지 결과를 보여줍니다.</p>
<p>어찌 됐던, 위와 같은 코드에서 아래와 같은 결과를 얻고 싶은 경우 XStream의 기본 기능만으로 해결할 수 없습니다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code22'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19222"><td class="code" id="p192code22"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Person<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;firstName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Steve<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/firstName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;lastName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Jobs<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/lastName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;middleName</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Person<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<h3>해결방법(XML) : Converter 구현 </h3>
<p>null value serialize를 위해서 여러가지 접근 방법이 있겠지만, Converter를 구현해서 사용하는게 가장 심플합니다.<br />
아래코드는 null value를 빈 element로 변환하도록 하는 Converter 구현입니다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code23'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19223"><td class="code" id="p192code23"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * NullConverterHack.
 *
 * &lt;p&gt;
 * {@link XStream}으로 serialize 할때 기본적으로 null value를 skip처리하므로, 
 * 빈 엘리먼트를 삽입하도록 하는 {@link Converter} 클래스임. 
 * &lt;/p&gt;
 * &lt;p&gt;
 * 아래와 같은 형태로 사용한다. 반드시 LOW PRIORITY로 사용해야 함.
 * &lt;code&gt;
 *  xstream.registerConverter(new NullConverterHack(xstream.getMapper()), XStream.PRIORITY_LOW);
 * &lt;/code&gt;
 * &lt;/p&gt;
 * 
 * (주의) unmarshal을 지원하지 않는다.
 * 
 * @see JsonWriterHack Json으로 serialize 할 경우에는 {@link NullConverterHack}과 {@link JsonWriterHack}을 함께 사용한다.
 * @author oddpoet
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> NullConverterHack <span style="color: #000000; font-weight: bold;">implements</span> Converter <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">private</span> Mapper mapper<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> NullConverterHack<span style="color: #009900;">&#40;</span>Mapper mapper<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006633;">mapper</span> <span style="color: #339933;">=</span> mapper<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 모든 클래스에 대해서 작동.
	 * 
	 * @param type
	 * @return
	 * @see com.thoughtworks.xstream.converters.ConverterMatcher#canConvert(java.lang.Class)
	 */</span>
    @SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> canConvert<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">Class</span> type<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * marshalling.
     * 
     * @param source
     * @param writer
     * @param context
     * @see com.thoughtworks.xstream.converters.Converter#marshal(java.lang.Object, com.thoughtworks.xstream.io.HierarchicalStreamWriter, com.thoughtworks.xstream.converters.MarshallingContext)
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> marshal<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Aobject+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">Object</span></a> source, HierarchicalStreamWriter writer, MarshallingContext context<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    	<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Afield+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Afield+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">Field</span></a> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> fieldSet <span style="color: #339933;">=</span> source.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">getDeclaredFields</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Afield+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Afield+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">Field</span></a> field <span style="color: #339933;">:</span> fieldSet<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Aobject+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">Object</span></a> member<span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>mapper.<span style="color: #006633;">shouldSerializeMember</span><span style="color: #009900;">&#40;</span>source.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, field.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    			<span style="color: #000000; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
    		field.<span style="color: #006633;">setAccessible</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
				member <span style="color: #339933;">=</span> field.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>source<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> name <span style="color: #339933;">=</span> mapper.<span style="color: #006633;">serializedMember</span><span style="color: #009900;">&#40;</span>field.<span style="color: #006633;">getDeclaringClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, field.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>member <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	    			writer.<span style="color: #006633;">startNode</span><span style="color: #009900;">&#40;</span>name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    			<span style="color: #666666; font-style: italic;">// 값이 null이면 내용은 채우지 않고 startNode(), endNode()만 호출</span>
	    			writer.<span style="color: #006633;">endNode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
	    			ExtendedHierarchicalStreamWriterHelper.<span style="color: #006633;">startNode</span><span style="color: #009900;">&#40;</span>writer, name, member.<span style="color: #006633;">getClass</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    			context.<span style="color: #006633;">convertAnother</span><span style="color: #009900;">&#40;</span>member<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    			writer.<span style="color: #006633;">endNode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	    		<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aillegalargumentexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Aillegalargumentexception+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">IllegalArgumentException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aillegalaccessexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Aillegalaccessexception+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">IllegalAccessException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
    	<span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #008000; font-style: italic; font-weight: bold;">/**
     * unmarshal을 지원하지 않는다.
     * 
     * @param reader
     * @param context
     * @return
     * @see com.thoughtworks.xstream.converters.Converter#unmarshal(com.thoughtworks.xstream.io.HierarchicalStreamReader, com.thoughtworks.xstream.converters.UnmarshallingContext)
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aobject+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Aobject+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">Object</span></a> unmarshal<span style="color: #009900;">&#40;</span>HierarchicalStreamReader reader, UnmarshallingContext context<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Converter 구현 코드가 길지 않으니 자세한 설명은 생략하겠습니다. 실제 사용방법은 아래와 같습니다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code24'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19224"><td class="code" id="p192code24"><pre class="java" style="font-family:monospace;">Person jobs <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Person<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">firstName</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Steve&quot;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">lastName</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">middleName</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
XStream xstream <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XStream<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Converter를 등록한다. 단, PRIORITY_LOW로 등록하도록 한다. </span>
xstream.<span style="color: #006633;">registerConverter</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> NullConverterHack<span style="color: #009900;">&#40;</span>xstream.<span style="color: #006633;">getMapper</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>, XStream.<span style="color: #006633;">PRIORITY_LOW</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
xstream.<span style="color: #006633;">processAnnotations</span><span style="color: #009900;">&#40;</span>Person.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> xml <span style="color: #339933;">=</span> xstream.<span style="color: #006633;">toXML</span><span style="color: #009900;">&#40;</span>jobs<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Asystem+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>xml<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>위와 같은 방법으로 객체를 XML로 serialize 하면 아래와 같은 결과를 얻을 수 있습니다. 공백문자와 null이 다른 형식으로 표현되고 있음에 유의하세요.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code25'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19225"><td class="code" id="p192code25"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Person<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;firstName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Steve<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/firstName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;lastName<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/lastName<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> <span style="color: #808080; font-style: italic;">&lt;!-- 공백문자는 이렇게 --&gt;</span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;middleName</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span> <span style="color: #808080; font-style: italic;">&lt;!-- null은 이렇게 ... --&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Person<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<h3> JSON의 경우 </h3>
<p>위와 같이 Converter를 추가해서 사용할 경우 XML 변환시 null 값에 대한 빈 element 출력은 가능합니다만, JSON 출력의 경우 아래와 같이 null 이 아닌 빈 객체({})로 출력되는 문제가 있습니다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code26'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19226"><td class="code" id="p192code26"><pre class="java" style="font-family:monospace;">Person jobs <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Person<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">firstName</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Steve&quot;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">lastName</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">middleName</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
XStream xstream <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XStream<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> JsonHierarchicalStreamDriver<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> HierarchicalStreamWriter createWriter<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Awriter+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Awriter+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">Writer</span></a> out<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> JsonWriter<span style="color: #009900;">&#40;</span>out, JsonWriter.<span style="color: #006633;">DROP_ROOT_MODE</span> <span style="color: #339933;">|</span> JsonWriter.<span style="color: #006633;">STRICT_MODE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
xstream.<span style="color: #006633;">registerConverter</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> NullConverterHack<span style="color: #009900;">&#40;</span>xstream.<span style="color: #006633;">getMapper</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>, XStream.<span style="color: #006633;">PRIORITY_LOW</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
xstream.<span style="color: #006633;">processAnnotations</span><span style="color: #009900;">&#40;</span>Person.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> xml <span style="color: #339933;">=</span> xstream.<span style="color: #006633;">toXML</span><span style="color: #009900;">&#40;</span>jobs<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Asystem+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>xml<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>즉 위와 같은 코드는 아래와 같은 JSON을 출력하게됩니다. null 대신 {}이 출력되지요.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code27'); return false;">View Code</a> JAVASCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19227"><td class="code" id="p192code27"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
  <span style="color: #3366CC;">&quot;firstName&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Steve&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #3366CC;">&quot;lastName&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #3366CC;">&quot;middleName&quot;</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Conveter의 Interface를 보면 알 수 있겠지만, JSON 출력시의 null 문제를 풀기 위해서는 Conveter 레벨에서 처리가 안됩니다. 결국 Writer 레벨에서 null 처리를 해야합니다. 그런데 기존 JsonWriter를 상속받아서 해결할 수 없기 때문에, 깔끔하지는 않지만 기존 JsonWriter 소스를 복사해서 새로운 클래스를 만들고 관련된 부분을 수정합니다. 수정해야할 부분은 <strong>endNode()</strong> 함수입니다. (아래 소스 참고)</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code28'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19228"><td class="code" id="p192code28"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * JsonWriterHack.
 *
 * &lt;p&gt;
 * XStream 패키지에 있는 {@link JsonWriter}에 수정을 가한 클래스이며, (상속받아서 해결 불가능함)
 * {@link NullConverterHack}과 함께 사용할 경우, null 값을 Json의 null로 변환해준다. 당연히 공백문자열(&quot;&quot;)과는 구분된다. 
 * &lt;/p&gt;
 * &lt;p&gt;
 * 수정된 부분은 {@link #endNode()} 함수이며, 수정한 부분에 comment를 달아놓았다.
 * 하지만 변경된 JsonWriter에 의해 사용시 예기치 못한 JSON 변환이 이루어질 수 있으므로, 주의하도록한다. 
 * &lt;/p&gt;
 * 
 * @see NullConverterHack {@link NullConverterHack}과 함께 사용해야 한다. 
 * @author oddpoet
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> JsonWriterHack <span style="color: #000000; font-weight: bold;">implements</span> ExtendedHierarchicalStreamWriter <span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// ... 나머지 코드는 JsonWriter와 동일하게 그대로 두고, endNode() 함수만 수정한다.</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> endNode<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		depth<span style="color: #339933;">--;</span>
		Node node <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Node<span style="color: #009900;">&#41;</span>elementStack.<span style="color: #006633;">pop</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>node.<span style="color: #006633;">clazz</span> <span style="color: #339933;">!=</span> <span style="color: #000066; font-weight: bold;">null</span> <span style="color: #339933;">&amp;&amp;</span> node.<span style="color: #006633;">isCollection</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>node.<span style="color: #006633;">fieldAlready</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				readyForNewLine <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			finishTag<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			writer.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>tagIsEmpty<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			readyForNewLine <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			writer.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;null&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>  <span style="color: #666666; font-style: italic;">// &lt;- 이부분을 수정. 원래는 writer.write(&quot;{}&quot;); 였음.</span>
			finishTag<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
			finishTag<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>node.<span style="color: #006633;">fieldAlready</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				writer.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;}&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		readyForNewLine <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>depth <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>mode <span style="color: #339933;">&amp;</span> DROP_ROOT_MODE<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>depth <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">!</span>node.<span style="color: #006633;">isCollection</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			writer.<span style="color: #006633;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;}&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			writer.<span style="color: #006633;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #666666; font-style: italic;">// 나머지 코드는 그대로 유지...</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>자 그럼, JsonWriter 대신 위에서 만든 JsonWriterHack으로 대체하면 원하는 null 출력을 볼 수 있습니다.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code29'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19229"><td class="code" id="p192code29"><pre class="java" style="font-family:monospace;">Person jobs <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Person<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">firstName</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Steve&quot;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">lastName</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span>
jobs.<span style="color: #006633;">middleName</span> <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
XStream xstream <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> XStream<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> JsonHierarchicalStreamDriver<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
	@Override
	<span style="color: #000000; font-weight: bold;">public</span> HierarchicalStreamWriter createWriter<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Awriter+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Awriter+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">Writer</span></a> out<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> JsonWriterHack<span style="color: #009900;">&#40;</span>out, JsonWriterHack.<span style="color: #006633;">DROP_ROOT_MODE</span> <span style="color: #339933;">|</span> JsonWriterHack.<span style="color: #006633;">STRICT_MODE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
xstream.<span style="color: #006633;">registerConverter</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> NullConverterHack<span style="color: #009900;">&#40;</span>xstream.<span style="color: #006633;">getMapper</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>, XStream.<span style="color: #006633;">PRIORITY_LOW</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
xstream.<span style="color: #006633;">processAnnotations</span><span style="color: #009900;">&#40;</span>Person.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> xml <span style="color: #339933;">=</span> xstream.<span style="color: #006633;">toXML</span><span style="color: #009900;">&#40;</span>jobs<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Asystem+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span>xml<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p192code30'); return false;">View Code</a> JAVASCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p19230"><td class="code" id="p192code30"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
  <span style="color: #3366CC;">&quot;firstName&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;Steve&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #3366CC;">&quot;lastName&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #3366CC;">&quot;middleName&quot;</span><span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Json에서의 null serialize 의 경우, 기존 구현체를 Rewrite해야해서 그다지 깔끔한 방법은 아닙니다. XStream으로 JSON 출력제어를 하는데 제약이 있으므로, 다른 object &#8211; JSON 매핑 library를 사용하는게 좋을 수도 있습니다. </p>

<!-- Quick Adsense Wordpress Plugin: http://techmilieu.com/quick-adsense -->
<div style="float:none;margin:10px 0 10px 0;text-align:center;">
<script type="text/javascript"><!--
google_ad_client = "pub-7051562360323491";
/* 컨텐츠하단(468x60) */
google_ad_slot = "1766915833";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>

<div style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div>]]></content:encoded>
			<wfw:commentRss>http://oddpoet.net/archives/192/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>삼성 첫 바다폰, wave를 보며&#8230;</title>
		<link>http://oddpoet.net/archives/122</link>
		<comments>http://oddpoet.net/archives/122#comments</comments>
		<pubDate>Mon, 15 Feb 2010 15:43:18 +0000</pubDate>
		<dc:creator>OddPoet</dc:creator>
				<category><![CDATA[모바일]]></category>
		<category><![CDATA[bada]]></category>
		<category><![CDATA[samsung]]></category>
		<category><![CDATA[wave]]></category>

		<guid isPermaLink="false">http://oddpoet.net/?p=122</guid>
		<description><![CDATA[삼성의 첫 바다폰 wave가 발표되었습니다. 스마트폰의 하드웨어 스펙이야 전반적으로 평균화되고 있는 추세이고, 이미 S/W가 중요해지는 시점이다보니 wave폰 자체보다는 삼성 독자 플랫폼인 바다(bada)에 더 관심이 가는데 bada developer(http://developer.bada.com/)를 보면 준비는 잘해온 듯 합니다.
바다의 미래가 불투명한 이유
하지만 바다플랫폼의 성공여부에 대해서 여전히 부정적인 생각이 많이 드네요. 위험요소들을 생각해보면 애플 따라하기 정도의 전략만으로는 부족하고, 플러스 알파가 필요한 시점이기 때문이죠.

개발자 [...]]]></description>
			<content:encoded><![CDATA[<p>삼성의 첫 바다폰 wave가 발표되었습니다. 스마트폰의 하드웨어 스펙이야 전반적으로 평균화되고 있는 추세이고, 이미 S/W가 중요해지는 시점이다보니 wave폰 자체보다는 삼성 독자 플랫폼인 바다(bada)에 더 관심이 가는데 bada developer(<a href="http://developer.bada.com/" onclick="pageTracker._trackPageview('/outgoing/developer.bada.com/?referer=');">http://developer.bada.com/</a>)를 보면 준비는 잘해온 듯 합니다.</p>
<div id="attachment_164" class="wp-caption aligncenter" style="width: 626px"><img class="size-full wp-image-164    " title="samsung wave" src="http://oddpoet.net/wp-content/uploads/2010/02/bada-wave.png" alt="samsung wave" width="616" height="377" /><p class="wp-caption-text">samsung wave</p></div>
<h3>바다의 미래가 불투명한 이유</h3>
<p>하지만 바다플랫폼의 성공여부에 대해서 여전히 부정적인 생각이 많이 드네요. 위험요소들을 생각해보면 애플 따라하기 정도의 전략만으로는 부족하고, 플러스 알파가 필요한 시점이기 때문이죠.<br />
<span id="more-122"></span></p>
<h4>개발자 커뮤니티 지원 경험이 없다!</h4>
<p>애플, MS, Google 등 앞으로 모바일 삼국지를 재현할 회사들을 보면 기본적으로 S/W회사이고(애플은 예외지만), 그동안 개발자 커뮤니티의 지원이나 협업 경험이 있는 회사들입니다. 하지만 삼성은 전혀 그렇지 않죠. 개발자 지원이라는게 단순히 API Reference 제공만으로 끝나는 것도 아닐 뿐더라, 플랫폼이라는게 단순히 H/W상에서 잘 작동하는 것 이상으로 로드맵, 정책 등이 중요합니다. 플랫폼이라면 H/W 제품보다 라이프사이클이 길기 때문이지요. 한번 팔고 끝나는게 아니니까요.</p>
<p>아직은 첫걸음이라지만 경쟁이 치열해지는 모바일 시장에서 시행착오를 할 시간적인 여유가 있을지 걱정입니다. 게다가 상대는 산전수전 다 겪은 백전노장들인데요.</p>
<h4>Killer App을 만들어줄 서드파티의 부재!</h4>
<p>이미 시장 주도권을 쥐고 있는 애플이나 지원세력이 많은 구글, MS와는 달리 삼성은 후발주자입니다. 게다가 자신이 잘해왔던 분야도 아니죠. 초기부터 에코 시스템이 가동되지 않으면 시장형성 조차 힘들 수도 있습니다.</p>
<p>애플 AppStore를 보면 메이저 업체들이 가세함에 따라 모바일 App도 개인 개발자가 수익낼 수 있는 영역은 이미 제한적입니다. 삼성이 여전히 대학생들 상대로 한 경진대회같은 걸로 에코 시스템의 초기 가동이 가능하리라고 판단했다면 오판입니다. 이미 아이폰 쪽은 이미 양적 팽창의 시기를 지났고, 안드로이드 시장은 구글이 웹에서 닦아놓은 기반이 있고 AppStore에서의 시행착오를 거친 상태라 기본 품질은 갖춘 App이 많습니다. 이 상황에서 단순 기능성 App만으로는 승부가 빤합니다. 애플의 3년을 구글의 안드로이드가 1년이면 따라잡을 기세인데, 삼성 바다는 애플의 3년을 그대로 따라할 건가요?</p>
<p>EA나 Gameloft 같은 업체와 제휴했다는 기사를 봤습니다만, 그 정도로는 힘들다는게 제 생각입니다. 어찌보면 Sony가 닌텐도에 뒷통수를 맞고 게임산업 경험이 전무한 상태에서  Playstation을 개발할 때와 비슷한 상황일 수 있는데, 당시 Namco를 서드파티 이상의 파트너로 끌어들여 한배를 탔었죠. 철권의 성공과 맞물리면서 닌텐도의 아성을 무너뜨리고 Playstation이 성공할 수 있었던 사례를 보면, 삼성 역시 한배를 탈 서드파티가 절실합니다. EA나 Gameloft는 어차피 멀티 플랫폼 전략으로 갈테니 삼성 바다OS에 플러스 알파를 더해줄 서드파티는 아니니까요. 킬러 타이틀 게임을 독점계약 한다면 모를까&#8230;</p>
<h4>개인 개발자를 끌어들일 떡밥이 없다!</h4>
<p>메이져 서드파티 업체가 없으면, 개인 개발자들이라도 끌어들여야 할텐데 삼성 바다 만의 매력포인트가 없습니다.<br />
다른 플랫폼에서 개발한다는 건 개발자에게도 큰 도전이라서 &#8216;iPhone 쪽으로 개발할까, 안드로이드 쪽으로 개발할까?&#8217; 하는 택일의 문제입니다. 파이 자체도 작은 바다플랫폼으로 개발자들을 끌어들이기 위해서는 애플보다 더 큰 떡밥을 던져야 합니다. Sony가 닌텐도의 횡포에 지친 게임개발사들을 보다 좋은 조건을 제시해서 끌어들였던 것 처럼요.</p>
<h3>마치며</h3>
<p>앱스토어만 만든다고 에코시스템이 만들어지지 않습니다. 삼성에는 똑똑한 사람들이 많으니 알아서들 잘 하시겠지만, 현재까지 상황으로는 삼성 바다플랫폼이 어떤 전략을 가지고 있는지 모르겠습니다. 큰 조직의 특성상 누군가 자리보전을 위해서 추진하고 있는 급조된 계획처럼 보입니다. 삼성의 스마트폰 라인업을 봤을 때도 &#8216;선택과 집중&#8217;이라는 삼성의 모토와도 맞지 않고, 먼 미래를 위한 전략이 있어보이지도 않습니다.</p>
<p>어쨌든 바다가 살아남던, 안드로이드가 대세가 되던, 윈도우 모바일이 화려하게 컴백하던&#8230; 아이폰 약정이 22개월 남은 저에게는 먼 미래의 얘기입니다.</p>

<!-- Quick Adsense Wordpress Plugin: http://techmilieu.com/quick-adsense -->
<div style="float:none;margin:10px 0 10px 0;text-align:center;">
<script type="text/javascript"><!--
google_ad_client = "pub-7051562360323491";
/* 컨텐츠하단(468x60) */
google_ad_slot = "1766915833";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>

<div style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div>]]></content:encoded>
			<wfw:commentRss>http://oddpoet.net/archives/122/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tomcat에서 한글파라메터 인코딩 처리</title>
		<link>http://oddpoet.net/archives/62</link>
		<comments>http://oddpoet.net/archives/62#comments</comments>
		<pubDate>Thu, 04 Feb 2010 08:07:31 +0000</pubDate>
		<dc:creator>OddPoet</dc:creator>
				<category><![CDATA[개발]]></category>
		<category><![CDATA[웹]]></category>
		<category><![CDATA[EUC-KR]]></category>
		<category><![CDATA[ISO-8859-1]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MS949]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[UTF8]]></category>
		<category><![CDATA[한글 인코딩]]></category>

		<guid isPermaLink="false">http://oddpoet.net/?p=62</guid>
		<description><![CDATA[요즘 대부분 웹페이지의 한글페이지는 UTF-8로 개발되는 추세지만, EUC-KR로 개발된 사이트를 UTF-8로 전환하려고 하는 경우 외부에서의 링크 등 때문에 Request의 파라메터에 대해서 UTF-8과 EUC-KR을 모두 지원해야할 경우가 종종 있습니다. 하지만 Java는 PHP 등과는 달리 String을 byte array로 보는게 아니라, byte array를 decoding해서 유니코드로 처리하므로 Tomcat의 character encoding 설정 만으로는 파라메터에 대해서 UTF-8과 EUC-KR을 모두 지원할 수 [...]]]></description>
			<content:encoded><![CDATA[<p>요즘 대부분 웹페이지의 한글페이지는 UTF-8로 개발되는 추세지만, EUC-KR로 개발된 사이트를 UTF-8로 전환하려고 하는 경우 외부에서의 링크 등 때문에 Request의 파라메터에 대해서 UTF-8과 EUC-KR을 모두 지원해야할 경우가 종종 있습니다. 하지만 Java는 PHP 등과는 달리 String을 byte array로 보는게 아니라, byte array를 decoding해서 유니코드로 처리하므로 Tomcat의 character encoding 설정 만으로는 파라메터에 대해서 UTF-8과 EUC-KR을 모두 지원할 수 없습니다. 이런 상황에서 써볼 수 있는 팁을 정리해봅니다. <span id="more-62"></span></p>
<h3>가정</h3>
<ol>
<li>한글 인코딩은  UTF-8, EUC-KR(MS949) 만 고려합니다.</li>
<li>EUC-KR과 MS949가 동일한 character set은 아니지만, MS949가 EUC-KR의 확장이므로 이 글에서는 동일하게 취급합니다.</li>
<li>UTF8에 대해서는 국내에서 일반적인 다국어 환경(한글/영어 등)만 가정합니다.</li>
</ol>
<h3>Byte array 얻어내기</h3>
<p>UTF-8 으로 encoding된 byte array를 EUC-KR로 decoding해서 String 객체를 생성해버리면(반대의 경우도 마찬가지), 최상위 비트가 이미 손실된 상황이므로 String 객체 만으로는 한글 인코딩을 바꿔 다시 디코딩할 방법이 없습니다. 따라서 request parameter의 한글인코딩을 판단하고, 그에 맞는 적절한 인코딩 방법으로 parameter에 대한 String 객체를 생성하기 위해서는 우선적으로 parameter에 대한 String 객체가 아닌 byte array를 얻어낼 수 있어야 합니다.</p>
<p>그런데 문제는 HttpServletRequest에 request에 대한 byte array를 얻어낼 인터페이스가 없다는 점이죠. GET method의 Request의 경우 URL 정보에서 직접 파라메터를 파싱해내는 방법도 적용해볼 수 있지만, POST method의 요청에서는 그것도 불가능합니다. 게다가 GET인 경우에도 IE계열의 경우에는 uri encoding도 하지 않은 채로 보내주는 막강센스를 보여주기 때문에 로직이 좀 짜증이 납니다.</p>
<p>그래서 byte array를 얻어내기 위해서 저는 request에 characterEncoding을 &#8220;ISO-8859-1&#8243; 를 사용합니다. 그렇게 하면, String에서 원래 byte array를 얻어낼 수 있습니다.</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p62code36'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6236"><td class="code" id="p62code36"><pre class="java" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">byte</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> barray<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// EUC-KR encoded byte array</span>
...
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> ko2 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#40;</span>barray, <span style="color: #0000ff;">&quot;ISO-8859-1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">byte</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> barray2 <span style="color: #339933;">=</span> ko.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ISO-8859-1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// barray2 is same as barray.</span>
&nbsp;
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> ko2 <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#40;</span>barray, <span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">byte</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> barray3 <span style="color: #339933;">=</span> ko2.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// barray3 may be not same as barray.</span></pre></td></tr></table></div>

<p>tomcat의 경우 HttpServletRequest 객체에 처음으로 getParameter() 메소드를 호출할 때, paramter들의 파싱이 이루어지므로 첫번째 Filter에서 아래와 같은 코드로 전체 파라메터를 ISO-8859-1 로 decoding해서 String 객체를 생성하도록  할 수 있습니다.</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p62code37'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6237"><td class="code" id="p62code37"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>isMultiPart<span style="color: #009900;">&#40;</span>request<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	request.<span style="color: #006633;">setCharacterEncoding</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ISO-8859-1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// byte array으로 변환하기 위해 ISO-8859-1로 설정함.</span>
	request.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;dummy&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// parameter parsing을 위해서 getParameter 호출</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>자~ 그럼 파라메터에서 byte array를 다음과 같은 형태로 얻어낼 수 있겠죠?</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p62code38'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6238"><td class="code" id="p62code38"><pre class="java" style="font-family:monospace;"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> query <span style="color: #339933;">=</span> request.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;query&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">byte</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bQuery <span style="color: #339933;">=</span> query.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ISO-8859-1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 원래의 byte array를 얻음.</span></pre></td></tr></table></div>

<h3>UTF-8 인지 EUC-KR인지 판별하기</h3>
<p>byte array를 가져 왔으니 byte sequence로 부터 한글 인코딩을 판별해내야겠지요.</p>
<p>php 등의 스크립트 언어에서는 iconv 같은 함수들을 썼겠지만, 아시다시피 그런 방식으로는 한글 인코딩을 완전하게 판별할 수 없습니다. 왜냐하면 UTF-8 한글과 EUC-KR(MS949)와는 코드영역이 겹치는 부분이 있기 때문입니다. 예를 들면, &#8220;<em>천호</em>&#8220;, &#8220;<em>치킨</em>&#8221; 같은 단어들이죠.</p>
<ul>
<li>UTF-8 코드영역 : <a href="http://ko.wikipedia.org/wiki/UTF-8" onclick="pageTracker._trackPageview('/outgoing/ko.wikipedia.org/wiki/UTF-8?referer=');">http://ko.wikipedia.org/wiki/UTF-8</a></li>
<li>UTF-8 byte sequence에 대한 정규식 : <a href="http://www.w3.org/International/questions/qa-forms-utf-8.en.php" onclick="pageTracker._trackPageview('/outgoing/www.w3.org/International/questions/qa-forms-utf-8.en.php?referer=');">http://www.w3.org/International/questions/qa-forms-utf-8.en.php</a></li>
<li>MS949 코드영역 : <a href="http://ko.wikipedia.org/wiki/%EC%BD%94%EB%93%9C_%ED%8E%98%EC%9D%B4%EC%A7%80_949" onclick="pageTracker._trackPageview('/outgoing/ko.wikipedia.org/wiki/_EC_BD_94_EB_93_9C_ED_8E_98_EC_9D_B4_EC_A7_80_949?referer=');">http://ko.wikipedia.org/wiki/코드_페이지_949</a></li>
</ul>
<p>위의 링크를 참고하면, UTF-8의 <em>non-overlong 2-byte</em> 영역이 MS949의 코드 영역과 겹치는 걸 확인 할 수 있습니다. 즉, &#8220;<em>치킨</em>&#8220;이라는 단어의 경우 UTF8로 인코딩하면 <strong>EC.B9.98.ED.82.A8</strong> 인데 이 byte sequence는 UTF-8 인코딩에도 valid하며, MS949 인코딩에도 valid 합니다. 결론적으로 byte sequence 만으로는 UTF-8인지, EUC-KR인지 완벽하게 판별가능한 방법은 없다는 얘기입니다. (iconv 역시 마찬가지입니다.)</p>
<p>그래서 여기에 3번째 가정을 적용합니다. 위의 첫번째 링크(Wikipedia: UTF-8)의 내용 중에 아래와 같은 내용이 있습니다.</p>
<blockquote><p>그 다음 1920문자 &#8211; 발음 구별 기호가 붙은 라틴 문자, 그리스 문자, 키릴 문자, 콥트 문자, 아르메니아 문자, 히브리 문자, 아랍 문자 &#8211; 는 2바이트로 표시되며&#8230;</p></blockquote>
<p>UTF-8 코드영역에서 이 부분이 바로 <em>non-overlong 2-byte</em> 에 해당하는 부분입니다. 일반적으로 자주 쓰는 문자들은 아닌것 같죠? 이 코드 영역을 쓰지 않는다는 가정을 하면, 한글에 있어서는 완전하게 UTF-8과 EUC-KR 중 어떤 인코딩으로 encode된 byte array인지 판별가능합니다.</p>
<p>byte sequence에 대한 한글 UTF-8 여부를 판별하는 코드는 아래에 있습니다. 참고로 전체를 정규식으로 로직을 쓸 경우, 큰 byte array에 대해서 Stack overflow가 발생하기 때문에 아래와 같이 byte 별로 쪼개어 test했습니다.</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p62code39'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6239"><td class="code" id="p62code39"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * 문자열이 UTF8 Character인지 검사하는 Utility Class.
 * &lt;p&gt;
 * byte arry 및 최상위 비트가 보존된 iso-8859-1로 decoding 문자열에 대한 체크만 가능하다. 
 * 한마디로, 이미 깨진 한글 따윈 검증할 수 없다. 
 * &lt;/p&gt;
 * &lt;p&gt;
 * utf8 문자셋에 대한 정규식. 
 * &lt;br/&gt;
 * MS949와 충돌나는 코드 영역 때문에, 2byte로 인코딩되는 문자들은 제외한다. (e.g. 치킨)
 * 한글 유니코드는 모두 /u0800 보다 큰 코드값에 배열되므로, 
 * utf8 인코딩시 2바이트로 인코딩되는 일이 없다. (첫자끝, 한글자모도 동일함)
 * 물론, 이렇게 함으로써 해당 코드영역을 사용하는 타언어의 코드를 체크할 수 없다. 
 * &lt;/p&gt;
 * 
 * 관련 정보 : 
 * 	1. http://ko.wikipedia.org/wiki/UTF-8
 *  2. http://forum.standardmag.org/viewtopic.php?id=462 
 * 
 * @see http://www.w3.org/International/questions/qa-forms-utf-8.en.php
 * 
 * @author oddpoet
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000000; font-weight: bold;">class</span> UTF8KoreanChecker <span style="color: #009900;">&#123;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Utility Class이므로 생성자를 막는다. 
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> UTF8KoreanChecker<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 주어진 byte array가 한글 UTF8 인코딩인지 체크한다. 
	 *  
	 * @param bytes bytes
	 * @return true/false
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isUTF8Korean<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> bytes.<span style="color: #006633;">length</span><span style="color: #339933;">;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isAscii<span style="color: #009900;">&#40;</span>bytes, i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				i <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 1byte 체크함. </span>
				<span style="color: #000000; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #666666; font-style: italic;">/*
			 * 위에서 언급한 바처럼, UTF-8 인코딩의 2바이트 영역이 MS949와 겹치므로, 
			 * 한글 UTF8 검증에는 사용하지 않는다. 
			 * 게다가 한글 UTF8은 2바이트로 인코딩되는 경우가 없으므로, 
			 * 한글에 한해서는 체크는 완전하게 가능하다. 
			} else if (isNonOverlong(bytes, i)) {
				i += 2; 
				continue; 
			}
			 */</span>
&nbsp;
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isExcludeOverlogs<span style="color: #009900;">&#40;</span>bytes, i<span style="color: #009900;">&#41;</span> 
				<span style="color: #339933;">||</span> isExcludingSurrogates<span style="color: #009900;">&#40;</span>bytes, i<span style="color: #009900;">&#41;</span> 
				<span style="color: #339933;">||</span> isStraight<span style="color: #009900;">&#40;</span>bytes, i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				i <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 3byte 체크함. </span>
				<span style="color: #000000; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>isPlane1to3<span style="color: #009900;">&#40;</span>bytes, i<span style="color: #009900;">&#41;</span> 
				<span style="color: #339933;">||</span> isPlane4to15<span style="color: #009900;">&#40;</span>bytes, i<span style="color: #009900;">&#41;</span> 
				<span style="color: #339933;">||</span> isPlane16<span style="color: #009900;">&#40;</span>bytes, i<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				i <span style="color: #339933;">+=</span> <span style="color: #cc66cc;">4</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 3byte 체크함. </span>
				<span style="color: #000000; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">false</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * (1byte)ascii ([\\x09\\x0A\\x0D\\x20-\\x7E])
	 * @param bytes bytes
	 * @param index 체크시작할 바이트 
	 * @return true/false
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isAscii<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes, <span style="color: #000066; font-weight: bold;">int</span> index<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x09 
			<span style="color: #339933;">||</span> bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x0A 
			<span style="color: #339933;">||</span> bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x0D 
			<span style="color: #339933;">||</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x20 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x7E
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * (3bytes) excluding overlogs (\\xE0[\\xA0-\\xBF][\\x80-\\xBF])
	 * @param bytes bytes
	 * @param index index
	 * @return true/false
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isExcludeOverlogs<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes, <span style="color: #000066; font-weight: bold;">int</span> index<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">&lt;</span> bytes.<span style="color: #006633;">length</span> 
			<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xE0 
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xA0 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * (3bytes) straight ([\\xE1-\\xEC\\xEE\\xEF][\\x80-\\xBF]{2})
	 * @param bytes bytes
	 * @param index index
	 * @return true/false
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isStraight<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes, <span style="color: #000066; font-weight: bold;">int</span> index<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">&lt;</span> bytes.<span style="color: #006633;">length</span> 
				<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>
					<span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xE1 
						<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xEC
					<span style="color: #009900;">&#41;</span> 
					<span style="color: #339933;">||</span> bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xEE 
					<span style="color: #339933;">||</span> bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xEF
				<span style="color: #009900;">&#41;</span>
				<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
					<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
				<span style="color: #009900;">&#41;</span> 
				<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
					<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
				<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * (3bytes) excluding surrogates (\\xED[\\x80-\\x9F][\\x80-\\xBF])
	 * @param bytes bytes
	 * @param index index
	 * @return true/false
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isExcludingSurrogates<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes, <span style="color: #000066; font-weight: bold;">int</span> index<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span> <span style="color: #339933;">&lt;</span> bytes.<span style="color: #006633;">length</span> 
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xED<span style="color: #009900;">&#41;</span> 
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x9F
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * (4bytes)planes 1-3 (\\xF0[\\x90-\\xBF][\\x80-\\xBF]{2})
	 * @param bytes bytes
	 * @param index index
	 * @return true/false
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isPlane1to3<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes, <span style="color: #000066; font-weight: bold;">int</span> index<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">&lt;</span> bytes.<span style="color: #006633;">length</span> 
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xF0<span style="color: #009900;">&#41;</span> 
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x90 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span> 
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * planes 4-15 ([\\xF1-\\xF3][\\x80-\\xBF]{3})
	 * @param bytes bytes
	 * @param index index
	 * @return true/false
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isPlane4to15<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes, <span style="color: #000066; font-weight: bold;">int</span> index<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">&lt;</span> bytes.<span style="color: #006633;">length</span> <span style="color: #666666; font-style: italic;">// 4byte check</span>
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xF1 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xF3
			<span style="color: #009900;">&#41;</span> 
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span> 
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * (4bytes)plane 16 (\\xF4[\\x80-\\x8F][\\x80-\\xBF]{2})
	 * @param bytes bytes
	 * @param index index
	 * @return true/false
	 */</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">boolean</span> isPlane16<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes, <span style="color: #000066; font-weight: bold;">int</span> index<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span> <span style="color: #339933;">&lt;</span> bytes.<span style="color: #006633;">length</span> <span style="color: #666666; font-style: italic;">// 4byte check</span>
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xF4<span style="color: #009900;">&#41;</span> 
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x8F
			<span style="color: #009900;">&#41;</span>
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span> 
			<span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&gt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0x80 
				<span style="color: #339933;">&amp;&amp;</span> bytes<span style="color: #009900;">&#91;</span>index <span style="color: #339933;">+</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">&lt;=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">byte</span><span style="color: #009900;">&#41;</span>0xBF
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * (2bytes)non-overlong ([\\xC2-\\xDF][\\x80-\\xBF])
	 * 이 코드 영역은 MS949와 겹치는 영역이므로, 한글 검증용으로 사용하지 않는다. 
	 * 
	 * UTF8 한글의 경우 2byte로 인코딩되는 경우가 없음. 
	 * 
	 * @param bytes bytes
	 * @param index index
	 * @return true/false
	 */</span>
	<span style="color: #666666; font-style: italic;">/* 사용하지 않으므로 주석처리. 
	private static boolean isNonOverlong(byte[] bytes, int index) {
		return index + 1 &lt; bytes.length // 2byte check
			&amp;&amp; bytes[index] &gt;= (byte)0xC2 &amp;&amp; bytes[index] &lt;= (byte)0xDF
			&amp;&amp; bytes[index + 1] &gt;= (byte)0x80 &amp;&amp; bytes[index + 1] &lt;= (byte)0xBF;
	}
	*/</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h3>정리</h3>
<p>byte array를 얻어서, 사용된 encoding을 판별하고 나면 아래와 같은 방법으로 적절한 encoding을 사용해서 한글 String 객체를 만들어 낼 수 있습니다.</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?" onclick="pageTracker._trackPageview('/outgoing/www.ericbess.com/ericblog/2008/03/03/wp-codebox/_examples?referer=');"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p62code40'); return false;">View Code</a> JAVA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p6240"><td class="code" id="p62code40"><pre class="java" style="font-family:monospace;"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> param <span style="color: #339933;">=</span> request.<span style="color: #006633;">getParameter</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;param&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">byte</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> bytes <span style="color: #339933;">=</span> param.<span style="color: #006633;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ISO-8859-1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a> koparam<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>UTF8KoreanChecker.<span style="color: #006633;">isUTF8Korean</span><span style="color: #009900;">&#40;</span>bytes<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	koparam <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#40;</span>bytes, <span style="color: #0000ff;">&quot;UTF-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
	koparam <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky" onclick="pageTracker._trackPageview('/outgoing/www.google.com/search?hl=en_amp_q=allinurl_3Astring+java.sun.com_amp_btnI=I_27m_20Feeling_20Lucky&amp;referer=');"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#40;</span>bytes, <span style="color: #0000ff;">&quot;MS949&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>


<!-- Quick Adsense Wordpress Plugin: http://techmilieu.com/quick-adsense -->
<div style="float:none;margin:10px 0 10px 0;text-align:center;">
<script type="text/javascript"><!--
google_ad_client = "pub-7051562360323491";
/* 컨텐츠하단(468x60) */
google_ad_slot = "1766915833";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>

<div style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div>]]></content:encoded>
			<wfw:commentRss>http://oddpoet.net/archives/62/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>구글이 말하는 개방의 진짜 의미는?</title>
		<link>http://oddpoet.net/archives/43</link>
		<comments>http://oddpoet.net/archives/43#comments</comments>
		<pubDate>Mon, 01 Feb 2010 15:30:54 +0000</pubDate>
		<dc:creator>OddPoet</dc:creator>
				<category><![CDATA[웹]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[the meaning of open]]></category>
		<category><![CDATA[개방의 의미]]></category>

		<guid isPermaLink="false">http://oddpoet.net/?p=43</guid>
		<description><![CDATA[지난 2009년 12월에 구글의 제품관리 총괄 임원 조나단 로젠버그(Jonathn Rosenberg) 가 공식블로그를 통해 &#8216;The meaning of open&#8216; 이라는 글을 올렸습니다. 이 글은 구글 공식 한국블로그에서  &#8217;개방(Open)의 의미&#8216; 라는 제목으로도 번역되어 올라왔습니다. 구글이 가지고 있는 개방에 대한 철학을 Open technology, Open Information 측면에서 잘 설명하고 있는 글입니다.
구글이 Open이라는 철학으로 기술적인 부분에서나 정보에 대한 접근에 있어서나 사용자들과 개발자들에게 지지를 [...]]]></description>
			<content:encoded><![CDATA[<p>지난 2009년 12월에 구글의 제품관리 총괄 임원 조나단 로젠버그(Jonathn Rosenberg) 가 공식블로그를 통해 &#8216;<a href="http://googleblog.blogspot.com/2009/12/meaning-of-open.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/googleblog.blogspot.com/2009/12/meaning-of-open.html?referer=');">The meaning of open</a>&#8216; 이라는 글을 올렸습니다. 이 글은 구글 공식 한국블로그에서  &#8217;<a href="http://googlekoreablog.blogspot.com/2010/01/blog-post_6951.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/googlekoreablog.blogspot.com/2010/01/blog-post_6951.html?referer=');">개방(Open)의 의미</a>&#8216; 라는 제목으로도 번역되어 올라왔습니다. 구글이 가지고 있는 개방에 대한 철학을 Open technology, Open Information 측면에서 잘 설명하고 있는 글입니다.</p>
<p>구글이 Open이라는 철학으로 기술적인 부분에서나 정보에 대한 접근에 있어서나 사용자들과 개발자들에게 지지를 받는 IT기업임은 분명합니다. 그리고 그들의 말대로 Open이야말로 웹 전체의 가치를 높이고, 웹이 많은 사람들에게 도움이 될 수 있는 전략이라는 것도 맞는 이야기 입니다.</p>
<p>하지만 달리 바라보면 사용자들의 검색어와 컨텐츠를 광고주에게 연결해서 수익을 만들어내는 구글에게 있어서, Open이란 웹에 공유되는 정보들과 컨텐츠를 늘려 자신들의 가치를 높일 수 있는 <strong>궁극의 전략</strong>이기도 합니다. 다른 이들에게도 도움이 되겠지만, 구글에게는 아주 큰 수익이 되는거죠. <span id="more-43"></span></p>
<p>IE, Firefox, Safari, Opera 등이 신기능으로 경쟁을 하고 있을 때,  Chrome을 출시해서 갑자기 브라우저 성능(속도)을 이슈화시킨 이유가 무엇일까요? 페이지뷰의 증가와 광고수익이 비례한다는 가정을 하면, 그건 브라우저들의 전반적인 성능을 높여 사용자들의 단위시간당 페이지 소비량를 높이는 것이 구글의 수익에 도움이 되기 때문일겁니다.  구글은 이미 웹에서의 게임의 법칙을 주도하고 있는 회사이므로, 웹이 더 커질 수록, 사용자들의 페이지뷰가 많아질수록 수익은 늘어납니다. 조금 냉정하게 보면 &#8216;<em>더 많이 정보를 만들어내고 공유해라. 기술도 주마. 돈은 내가 벌테니</em>&#8216;&#8230; 이런 거죠. 안드로이드 역시 아이폰에 대항할 무기가 없는 H/W 제조사들을 위한 떡밥이자, 모바일에서도 게임의 법칙을 주도하겠다는 야심으로 만들어진 플랫폼이구요.</p>
<p><a href="http://www.appleforum.com/mac-column/58550-%EC%96%B8%EB%A1%A0%EC%9D%98-%EC%A0%81-%EA%B5%AC%EA%B8%80.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.appleforum.com/mac-column/58550-_EC_96_B8_EB_A1_A0_EC_9D_98-_EC_A0_81-_EA_B5_AC_EA_B8_80.html?referer=');">&#8220;언론의 적 구글&#8221;</a> 이라는 글에서  구글의 이해와 충돌하고 있는 신문사와 출판사들의 경우를 보면, Open이라는 그들의 철학이 다소 위선처럼 느껴지네요. (물론 이 예는 전세대 미디어가 인터넷 시대에 수익구조를 만들어내지 못하고 붕괴하는 모습으로도 볼 수 있지요. ^^ ) 몇일전 스티브 잡스가 &#8216;Don&#8217;t be evil&#8217;이라는 구글의 모토를 &#8216;bullshit&#8217;이라 욕한데에는 이러한 부분에 대한 지적이라 생각합니다. 애플은 iTunes를 통해 컨텐츠 사업자들과 수익을 나누고 있으니까요.</p>
<p>구글이라는 회사를 좋아하고 구글의 서비스를 삶의 일부로 사용하고 있지만, 가끔씩 구글은 이미  Big brother가 되어버린건 아닌지 하는 섬뜩한 생각이 듭니다. 구글에서 evil이라는 단어가 검색되지 않는 날이 온다면 &#8230; 그게 그때 이겠지요?</p>

<!-- Quick Adsense Wordpress Plugin: http://techmilieu.com/quick-adsense -->
<div style="float:none;margin:10px 0 10px 0;text-align:center;">
<script type="text/javascript"><!--
google_ad_client = "pub-7051562360323491";
/* 컨텐츠하단(468x60) */
google_ad_slot = "1766915833";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div>

<div style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div>]]></content:encoded>
			<wfw:commentRss>http://oddpoet.net/archives/43/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flash, HTML5, 그리고 mobile</title>
		<link>http://oddpoet.net/archives/34</link>
		<comments>http://oddpoet.net/archives/34#comments</comments>
		<pubDate>Mon, 01 Feb 2010 05:43:17 +0000</pubDate>
		<dc:creator>OddPoet</dc:creator>
				<category><![CDATA[모바일]]></category>
		<category><![CDATA[웹]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[HTML5]]></category>

		<guid isPermaLink="false">http://oddpoet.net/?p=34</guid>
		<description><![CDATA[HTML5에서 동영상 태그 지원, 2D drawing를 지원하게되면서 Adobe의 Flash같은 브라우저 플러그인 기반의 기술들의 미래에 대한 얘기가 작년에 회자되었는데요, 최근 유튜브의 HTML5 지원과 스티브 잡스의 발언으로 다시 이슈가 되고 있네요.

HTML5 : 플래시와 실버라이트를 물리칠 수 있을까?
유튜브 : HTML5 비디오 지원 &#8211; video 태그
스티브잡스 &#8220;구글의 모토는 헛소리&#8230; 어도비는 게을러&#8221;

Flash가 HTML5에 의해 완전히 대체될 거라고는 생각하지 않습니다만,  최신버전의 [...]]]></description>
			<content:encoded><![CDATA[<p>HTML5에서 동영상 태그 지원, 2D drawing를 지원하게되면서 Adobe의 Flash같은 브라우저 플러그인 기반의 기술들의 미래에 대한 얘기가 작년에 회자되었는데요, 최근 유튜브의 HTML5 지원과 스티브 잡스의 발언으로 다시 이슈가 되고 있네요.</p>
<ul>
<li><a href="http://www.idg.co.kr/newscenter/common/newCommonView.do?newsId=56850" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.idg.co.kr/newscenter/common/newCommonView.do?newsId=56850&amp;referer=');">HTML5 : 플래시와 실버라이트를 물리칠 수 있을까?</a></li>
<li><a href="http://barosl.com/blog/entry/youtube-launches-html5-beta" target="_blank" onclick="pageTracker._trackPageview('/outgoing/barosl.com/blog/entry/youtube-launches-html5-beta?referer=');">유튜브 : HTML5 비디오 지원 &#8211; video 태그</a></li>
<li><a href="http://blog.hankyung.com/kim215/339488" target="_blank" onclick="pageTracker._trackPageview('/outgoing/blog.hankyung.com/kim215/339488?referer=');">스티브잡스 &#8220;구글의 모토는 헛소리&#8230; 어도비는 게을러&#8221;</a></li>
</ul>
<p>Flash가 HTML5에 의해 완전히 대체될 거라고는 생각하지 않습니다만,  최신버전의 웹브라우저들과 유튜브가  HTML5의 동영상태그를 지원하기 시작했다는 점에 웹에서 Flash의 입지는 줄어들게 될 것 같습니다. 게다가 아이폰이 모바일 웹 트래픽의 대부분을 점유하고 있는 시점에서,  애플이 모바일 환경에서의 Flash를 부정적으로 생각하고 있다는 점은 Flash의 미래를 불투명하게 하는 또다른 요소가 되고 있습니다. <span id="more-34"></span></p>
<p>옛날부터 사연이 많은 Apple과 Adobe의 관계를 생각할 때 Apple이 모바일 점유율을 믿고 기싸움을 하는 것으로 볼 수도 있습니다만, 사실 다른 플랫폼은 둘째치고 윈도우 환경에서도 Flash가 실행될때 소모하는 엄청난 리소스 점유율 등을 볼 때 모바일 웹환경에서 Flash는 지양해야할 기술이라고 생각합니다. 웹표준이 추구했던 바가 다양한 환경에서 동일한 정보접근성을 제공하는 데 있었다는 점을 생각하면, 브라우저 플러그인 기반의 기술들은 어느정도 한계를 가질 수 밖에 없으며 언젠가는 서서히 웹에서의 영역이 줄어들 수 밖에 없을 겁니다.</p>
<p>Flash가  그동안 지적되었던 성능이나 리소스 점유율의 문제에 효과적으로 대응하지 못했다는 점에서, 다분히 감정적인 반응으로 보이는 잡스의 &#8216;어도비는 게을러&#8217;라는 얘기도 개인적으로는 어느 정도 공감이 갑니다.</p>
<p>추후 웹에서 시장을 주도하는 기술이 어떤 것이 될지는 모르겠지만, 모바일 시장에서의 승자가 유리한 고지를 차지할 것 같습니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://oddpoet.net/archives/34/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>구글 IE6 지원 중단, 그리나 한국의 웹은</title>
		<link>http://oddpoet.net/archives/11</link>
		<comments>http://oddpoet.net/archives/11#comments</comments>
		<pubDate>Sun, 31 Jan 2010 14:08:25 +0000</pubDate>
		<dc:creator>OddPoet</dc:creator>
				<category><![CDATA[웹]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[IE6]]></category>

		<guid isPermaLink="false">http://oddpoet.net/?p=11</guid>
		<description><![CDATA[구글이 올해 3월 1일부터 점진적으로 IE6에 대한 지원을 중단하기로 했다고 발표했습니다. 일단은 일부 서비스(Gmail, Google docs)에서 IE6가 지원가능 브라우저에서 제외되지만, 서서히 다른 서비스에서도 IE6는 지원목록에서 제외될 것 같습니다.
IE6가 윈도우즈XP의 기본브라우저로 2001년에 발표되었으니 아마도 가장 오랜시간동안 현역생활을 한 웹브라우저일 것 같네요. 그러한 이유에는 MS가 오랫동안 업데이트 없이 방치했던 것도 있었지만, 윈도우즈 비스타의 출시지연과 시장에서의 실패 등의 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://googleenterprise.blogspot.com/2010/01/modern-browsers-for-modern-applications.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/googleenterprise.blogspot.com/2010/01/modern-browsers-for-modern-applications.html?referer=');">구글이 올해 3월 1일부터 점진적으로 IE6에 대한 지원을 중단하기로 했다고 발표했습니다.</a> 일단은 일부 서비스(Gmail, Google docs)에서 IE6가 지원가능 브라우저에서 제외되지만, 서서히 다른 서비스에서도 IE6는 지원목록에서 제외될 것 같습니다.</p>
<p>IE6가 윈도우즈XP의 기본브라우저로 2001년에 발표되었으니 아마도 가장 오랜시간동안 현역생활을 한 웹브라우저일 것 같네요. 그러한 이유에는 MS가 오랫동안 업데이트 없이 방치했던 것도 있었지만, 윈도우즈 비스타의 출시지연과 시장에서의 실패 등의 상황들도 IE7 보급이 더뎌졌던 이유도 있었지요. 아뭏든 IE6는 윈도우즈 XP의 수명만큼이나 오랫동안(9년) 사용되고 있으니, 현대적인 브라우저의 관점에서는 백발성성한  노장입니다. 그런 면에서 구글의 이번 IE6 지원 중단 발표는 &#8216;신은 죽었다&#8217;고 한 니체의 얘기만큼이나 선언적으로 중요한 계기가 되리라 생각합니다. 다른 유명한 웹서비스들도 서서히 지원을 중단하면서 자연스레 IE6는 역사 속으로 사라지겠지요. <span id="more-11"></span></p>
<p>그!러!나! 한국에서 IE6가 언제쯤 사라질 수 있을까를 생각해보면 암담합니다.</p>
<div id="attachment_14" class="wp-caption aligncenter" style="width: 585px"><a rel="attachment wp-att-14" href="http://oddpoet.net/archives/11/2009-browser-trend"><img class="size-full wp-image-14" title="2009-browser-trend" src="http://oddpoet.net/wp-content/uploads/2010/01/2009-browser-trend.png" alt="2009년 한국 브라우저 버전별 점유율" width="575" height="211" /></a><p class="wp-caption-text">2009년 한국 브라우저 버전별 점유율</p></div>
<p>위 차트는 <a href="http://trend.logger.co.kr/introduction.tsp" target="_blank" onclick="pageTracker._trackPageview('/outgoing/trend.logger.co.kr/introduction.tsp?referer=');">InternetTrend </a>에서 뽑은 2009년 브라우져 버전별 점유율입니다. IE와 그의 형제들이 98% 넘는 점유율을 보이고 있는데, 세계적으로 30% 가까운 점유율을 보인다는 Firefox의 경우 한국에서는 개발자들만 쓰는 모양입니다. <strong>50%가 넘는 IE6의 점유율이 매우 인상적입니다. </strong></p>
<div id="attachment_15" class="wp-caption aligncenter" style="width: 693px"><a rel="attachment wp-att-15" href="http://oddpoet.net/archives/11/statcounterglobal"><img class="size-full wp-image-15 " title="StatCounterGlobal" src="http://oddpoet.net/wp-content/uploads/2010/01/StatCounterGlobal.jpg" alt="2009 세계 브라우저별 점유율" width="683" height="400" /></a><p class="wp-caption-text">2009 세계 브라우저 버전별 점유율</p></div>
<p><a href="http://gs.statcounter.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/gs.statcounter.com/?referer=');">StatCounter</a> 에서 확인한 전세계의 브라우저 점유율 추이를 보면 IE6가 이미 20%이하로 떨어진 걸 확인할 수 있습니다. 구글 입장에서 충분히 지원중단을 감행할 만한 상황인 거죠. 하지만 IE6 점유율이 50%가 넘는 한국의 상황에서는 네이버, 다음, 싸이월드 등 한국 대표 포털들이 합심해서 IE6 지원중단을 발표한다고 해도 쉽지 않을 것 같습니다. 고객센터만 난리나는 거죠.</p>
<p>ActiveX로 되지도 않은 보안 운운하지 말고, 쥐라기 시대의 공룡들이나 썼을 법한 IE6의 사용중지 캠페인이라도 정부차원에서 추진하시는게 대한민국의 웹보안에 더 좋을 듯 합니다. ActiveX로 전국민PC 지켜주시려고 애쓰시는 건 알겠는데, 그런 삽질도 몇년째 하셨으면 이제 깨달으실 때 안됐나요? <a href="http://www.engadget.com/2010/01/16/germany-advises-its-citizens-to-say-nein-to-internet-explorer/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.engadget.com/2010/01/16/germany-advises-its-citizens-to-say-nein-to-internet-explorer/?referer=');">독일정부의 인터넷보안부서도 IE 쓰지 말랬다자나요</a>. IE7/8은 봐줄테니 <strong>IE6사용중지특별법</strong>이라도 만들면 안될까요?</p>
]]></content:encoded>
			<wfw:commentRss>http://oddpoet.net/archives/11/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wordpress로 복귀했습니다.</title>
		<link>http://oddpoet.net/archives/5</link>
		<comments>http://oddpoet.net/archives/5#comments</comments>
		<pubDate>Sat, 30 Jan 2010 22:12:12 +0000</pubDate>
		<dc:creator>OddPoet</dc:creator>
				<category><![CDATA[기타]]></category>

		<guid isPermaLink="false">http://oddpoet.net/?p=5</guid>
		<description><![CDATA[2년만에 테터툴즈/텍스트큐브를 버리고 다시 Wordpress로 복귀했습니다.
옛 포스트들을 옮겨올까 했지만 백만년에 한번씩 포스팅하던 게으르고 불성실한 블로거이다보니 과거는 지워버리고 싶기도 하고, textcube의 이미지 갤러리가 제대로 import도 안되기도 하고, 퍼머링크를 유지하는 것도 잔손 많이 갈것 같고 &#8230;. 뭐 그러다보니 깔끔하게 새로 시작하기로 했습니다.
전에 Wordpress에서 Textcube로 넘어갈 때도 과거 포스트들 버렸었는데(DB는 남아있지만), 이번에도 또 블로그툴 바꾸려다 보니 내가 뭐하는 [...]]]></description>
			<content:encoded><![CDATA[<p>2년만에 테터툴즈/텍스트큐브를 버리고 다시 Wordpress로 복귀했습니다.</p>
<p>옛 포스트들을 옮겨올까 했지만 백만년에 한번씩 포스팅하던 게으르고 불성실한 블로거이다보니 과거는 지워버리고 싶기도 하고, textcube의 이미지 갤러리가 제대로 import도 안되기도 하고, 퍼머링크를 유지하는 것도 잔손 많이 갈것 같고 &#8230;. 뭐 그러다보니 깔끔하게 새로 시작하기로 했습니다.</p>
<p>전에 Wordpress에서 Textcube로 넘어갈 때도 과거 포스트들 버렸었는데(DB는 남아있지만), 이번에도 또 블로그툴 바꾸려다 보니 내가 뭐하는 짓인가 싶군요. 다시는 이런짓하지 말아야 겠습니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://oddpoet.net/archives/5/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
