<?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>程默的博客 &#187; 字符编码</title>
	<atom:link href="http://blog.chacuo.net/tag/%e5%ad%97%e7%ac%a6%e7%bc%96%e7%a0%81/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.chacuo.net</link>
	<description>web原理、web架构、web安全、web性能、服务器性能、服务器架构、服务器安全;你不能预知明天，但你可以利用今天。你不能样样顺利，但你可以事事尽力!</description>
	<lastBuildDate>Mon, 31 Aug 2020 15:33:40 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>XXencode 编码，XX编码介绍、XXencode编码转换原理、算法</title>
		<link>http://blog.chacuo.net/778.html</link>
		<comments>http://blog.chacuo.net/778.html#comments</comments>
		<pubDate>Fri, 02 Aug 2013 11:08:32 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[xxencode]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=778</guid>
		<description><![CDATA[Xxencode编码，也是一个二进制字符转换为普通打印字符方法。跟UUencode编码原理方法很相似，唯独不同 [...]]]></description>
				<content:encoded><![CDATA[<p>Xxencode编码，也是一个二进制字符转换为普通打印字符方法。跟<a title="UUencode编码原理" href="http://blog.chacuo.net/753.html" target="_blank">UUencode编码原理</a>方法很相似，唯独不同的是可打印字符不同。通个UUencode编码，我们知道它有个缺点就是，64个可打印字符中，有很多的特殊字符。而XXencode编码方法，对64个原字符有做规范。这里它有跟Base64类型了。都有指定可打印字符范围、及编号。Xxencode编码在上世纪后期，IBM大型机中得到很广泛的应用。现在逐渐被Base64编码转换方法所取代了。</p>
<p><strong>Xxencode编码原理</strong></p>
<p>XXencode将输入文本以每三个字节为单位进行编码。如果最后剩下的资料少于三个字节，不够的部份用零补齐。这三个字节共有24个Bit，以6bit为单位分为4个组，每个组以十进制来表示所出现的数值只会落在0到63之间。以所对应值的位置字符代替。它所选择的可打印字符是：+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz，一共64个字符。跟base64打印字符相比，就是uuencode多一个“-” 字符，少一个&#8221;/” 字符。 但是，它里面字符顺序与Base64完全不一样。与UUencode比较，这里面所选择字符，都是常见字符，没有特殊字符。这也决定它当年流行使用原因！</p>
<p>每60个编码输出（相当于45个输入字节）将输出为独立的一行，每行的开头会加上<b>长度字符</b>，除了最后一行之外，长度字符都应该是“h”这个字符（<b>45，刚好是64字符中，第45位&#8217;h’字符</b>），最后一行的长度字符为<b>剩下的字节数目</b> 在64字符中位置所代表字符。</p>
<p><strong>问题：</strong>uuencode编码转换为xxencode编码怎么样操作？</p>
<p>从2中编码原理来看，几乎一样。就是所用的64个字符不一样。一次，简单对uuencode转换后字符，逐位（处理’`’字符)减去32，然后得到一个值。这个值在xxencode 64字符中所对应位置字符替换即可。</p>
<p><strong>XXencode编码转换过程</strong></p>
<blockquote><pre>    <table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center"><tbody><tr><td>原始字符 </td><td colspan="8">C </td><td colspan="8">a </td><td colspan="8">t </td></tr><tr><td>原始ASCII码（十进制） </td><td colspan="8">67 </td><td colspan="8">97 </td><td colspan="8">116 </td></tr><tr><td>ASCII码（二进制） </td><td>0 </td><td>1 </td><td>0 </td><td>0 </td><td>0 </td><td>0 </td><td>1 </td><td>1 </td><td>0 </td><td>1 </td><td>1 </td><td>0 </td><td>0 </td><td>0 </td><td>0 </td><td>1 </td><td>0 </td><td>1 </td><td>1 </td><td>1 </td><td>0 </td><td>1 </td><td>0 </td><td>0 </td></tr><tr><td>新的十进制数值 </td><td colspan="6">16 </td><td colspan="6">54 </td><td colspan="6">5 </td><td colspan="6">52 </td></tr><tr><td>编码后的XXencode字符 </td><td colspan="6">E</td><td colspan="6">q</td><td colspan="6">3 </td><td colspan="6">O</td></tr></tbody></table></pre>
<pre>字符串：'Cat‘ 编码后是：Eq3O</pre>
</blockquote>
<pre><strong>XXencode编码PHP实现过程</strong></pre>
<blockquote><pre class="brush: php; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;">/**
 *xxencode编码*
 *@author 程默
 *@copyright http://blog.chacuo.net/
 *@param string $src 待处理字符串
 *@return string encode编码完字符串
 */
function c_xx_encode($src)
{
	//64个可打印字符
	static $base="+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    ///每次读取3个字节
    $lbyte = 3;
    ////将原始的3个字节转换为4个字节
    $slen=strlen($src);
    $smod = ($slen%$lbyte);
    $snum = floor($slen/$lbyte);
 
 
    $desc = array();
     
    //将剩下字节以0字节补齐
    $src = $smod===0?$src:$src.str_repeat("\0",$lbyte-$smod);
    $snum = $smod===0?$snum:$snum+1;
 
    for($i=0;$i&lt;$snum;$i++)
    {
        ////读取3个字节
        $_arr = array_map('ord',str_split(substr($src,$i*$lbyte,$lbyte)));
 
        ///计算每一个6位值
        $_dec = array();
        $_dec[]=$_arr[0]&gt;&gt;2;
        $_dec[]=(($_arr[0]&amp;3)&lt;&lt;4)|($_arr[1]&gt;&gt;4);
        $_dec[]=(($_arr[1]&amp;0xF)&lt;&lt;2)|($_arr[2]&gt;&gt;6);
        $_dec[]=$_arr[2]&amp;63;
         
        ///求每一位值，在64字符中所对应的字符
        foreach ($_dec as &amp;$v)
        {
           $v=$base[$v];
        }
        $desc = array_merge($desc,$_dec);
    }
     

    //每60个编码输出（相当于45个输入字节）将输出为独立的一行，每行的开头会加上长度字符，除了最后一行之外，长度字符都应该是'h'这个ASCII字符（45），最后一行的长度字符为剩下的字节数目,在64字符中对应字符。
    $abyte = 60;
    $crlf = "\r\n";
    $alen = count($desc);
    $anum = floor($alen/$abyte);
    $amod = ($alen%$abyte);
     
    $adesc = array();
     
    for ($i=0;$i&lt;$anum;$i++)
    {
        $adesc[]='h'.implode('',array_slice($desc,$i*$abyte,$abyte)).$crlf;
    }
     
    ///截取后面剩余数组长度
    if($amod!==0)
    {
        ///以下计算不满45字节编码情况
        $adesc[]=$base[$amod/4*$lbyte+($smod?$smod-$lbyte:$smod)].implode('',array_slice($desc,-$amod)).$crlf;
    }
     
    return implode('',$adesc);  
}</pre>
</blockquote>
<p>以上代码从uuencode编码做简单修改而来，基本上去掉+32一些地方。知道编码原理，其实我们很容易实现uuencode-&gt;xxencode转换的</p>
<blockquote>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/08/image2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="xxencode编码" border="0" alt="xxencode编码" src="http://blog.chacuo.net/wp-content/uploads/2013/08/image_thumb2.png" width="821" height="311"></a> </p>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/08/image3.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="xxencode编码" border="0" alt="xxencode编码" src="http://blog.chacuo.net/wp-content/uploads/2013/08/image_thumb3.png" width="821" height="405"></a> </p>
<p>以上转换后结果，与专业转换工具一致的。好了，通过学习这类用可打印字符表示二进制字节的编码方法。我们可以发现很多有趣东西！对应以后我们如果做自己的编码转换，可以给我们很多借鉴！欢迎朋友们给出自己的意见！</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/778.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UUencode 编码，UU编码介绍、UUencode编码转换原理、算法</title>
		<link>http://blog.chacuo.net/753.html</link>
		<comments>http://blog.chacuo.net/753.html#comments</comments>
		<pubDate>Thu, 01 Aug 2013 10:16:47 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[uuencode]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=753</guid>
		<description><![CDATA[UUencode编码起先用在unix网络中，先是Unix系统下将二进制的资料借由uucp邮件系统传输的一个编码 [...]]]></description>
				<content:encoded><![CDATA[<p>UUencode编码起先用在unix网络中，先是Unix系统下将二进制的资料借由uucp邮件系统传输的一个编码程式，也是一种二进制到文字的编码。不属于MIME编码中一员。它也是定义了用可打印字符表示二进制文字一种方法，并不是一种新的编码集合。主要解决，二进制字符在传输、存储中问题。它早期在电子邮件中使用较多，最近这些年来基本上被MIME 中Base64所取代了。E-mail中一般采用UU、MIME、BINHEX三种编码标准! 我想，了解下这种编码将二进制字符转换为可打印字符实现思路！对我们以后做类似处理工作，应该会有很多的启示。</p>
<p><strong>UUencode编码过程</strong></p>
<p>Uuencode将输入资料以每三个字节为单位进行编码，如此重复进行。如果最后剩下的资料少于三个字节，不够的部份用零补齐。这三个字节共有24个Bit，以6-bit为单位分为4个群组，每个群组以十进制来表示所出现的数值只会落在0到63之间。将每个数加上32，所产生的结果刚好落在ASCII字符集中可打印字符（32-空白&#8230;95-底线）的范围之中。每60个编码输出（相当于45个输入字节）将输出为独立的一行，每行的开头会加上<b>长度字符</b>，除了最后一行之外，长度字符都应该是&#8217;M'这个ASCII字符（77=32+<b>45</b>），最后一行的长度字符为<b>32+剩下的字节数目</b>这个ASCII字符。如果是一个 0字节那它应该被转换为0&#215;60而不是0&#215;20，因为（前引用&#8217;`'）优于 0&#215;20（空格&#8217; &#8216;)。</p>
<p>特点一：看到特点了吧，也是64字符，也是一组6位。怎么,怎么,跟我们的<a title="base64算法、编码原理" href="http://blog.chacuo.net/719.html" target="_blank">base64</a>这么相似呢？是的，从这个定义中，我们确实发现它跟base64比起来很相似了。 </p>
<p>特点二：它定义64字符，不用写映射表，是通过加32转换到可打印字符范围中。比起base64，更为简单！</p>
<p><strong>思考问题：</strong>它的字符范围都是可打印字符，我们会发现64字符集合中，有很多是特殊字符:”!&#8221;#￥%&amp;‘（）*+=’” 等等。这些字符在不同应用中，可能都有些特殊用途。因此，在使用该编码时候，或许会出现一些问题。我想这也许是UUencode编码方法，逐渐被Base64所取代的原因吧。</p>
<blockquote><pre><font style="background-color: #ffffff" face="Arial"><strong>UUencode 64字符集</strong></font></pre>
<pre><table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center"><tbody><tr valign="bottom"><th>可打印字符</th><th>十进制ASCII值</th><th>uuencode<br />二进制表示</th><th>uuencode<br />十进制表示</th><th>&nbsp;</th><th>可打印字符</th><th>十进制ASCII值</th><th>uuencode<br />二进制表示</th><th>uuencode<br />十进制表示</th></tr><tr><td align="middle">(space)</td><td align="middle">32</td><td align="middle">000 000</td><td align="middle">0</td><td>&nbsp;</td><td align="middle">@</td><td align="middle">64</td><td align="middle">100 000</td><td align="middle">32</td></tr><tr><td align="middle">!</td><td align="middle">33</td><td align="middle">000 001</td><td align="middle">1</td><td>&nbsp;</td><td align="middle">A</td><td align="middle">65</td><td align="middle">100 001</td><td align="middle">33</td></tr><tr><td align="middle">"</td><td align="middle">34</td><td align="middle">000 010</td><td align="middle">2</td><td>&nbsp;</td><td align="middle">B</td><td align="middle">66</td><td align="middle">100 010</td><td align="middle">34</td></tr><tr><td align="middle">#</td><td align="middle">35</td><td align="middle">000 011</td><td align="middle">3</td><td>&nbsp;</td><td align="middle">C</td><td align="middle">67</td><td align="middle">100 011</td><td align="middle">35</td></tr><tr><td align="middle">$</td><td align="middle">36</td><td align="middle">000 100</td><td align="middle">4</td><td>&nbsp;</td><td align="middle">D</td><td align="middle">68</td><td align="middle">100 100</td><td align="middle">36</td></tr><tr><td align="middle">%</td><td align="middle">37</td><td align="middle">000 101</td><td align="middle">5</td><td>&nbsp;</td><td align="middle">E</td><td align="middle">69</td><td align="middle">100 101</td><td align="middle">37</td></tr><tr><td align="middle">&amp;</td><td align="middle">38</td><td align="middle">000 110</td><td align="middle">6</td><td>&nbsp;</td><td align="middle">F</td><td align="middle">70</td><td align="middle">100 110</td><td align="middle">38</td></tr><tr><td align="middle">'</td><td align="middle">39</td><td align="middle">000 111</td><td align="middle">7</td><td>&nbsp;</td><td align="middle">G</td><td align="middle">71</td><td align="middle">100 111</td><td align="middle">39</td></tr><tr><td align="middle">(</td><td align="middle">40</td><td align="middle">001 000</td><td align="middle">8</td><td>&nbsp;</td><td align="middle">H</td><td align="middle">72</td><td align="middle">101 000</td><td align="middle">40</td></tr><tr><td align="middle">)</td><td align="middle">41</td><td align="middle">001 001</td><td align="middle">9</td><td>&nbsp;</td><td align="middle">I</td><td align="middle">73</td><td align="middle">101 001</td><td align="middle">41</td></tr><tr><td align="middle">*</td><td align="middle">42</td><td align="middle">001 010</td><td align="middle">10</td><td>&nbsp;</td><td align="middle">J</td><td align="middle">74</td><td align="middle">101 010</td><td align="middle">42</td></tr><tr><td align="middle">+</td><td align="middle">43</td><td align="middle">001 011</td><td align="middle">11</td><td>&nbsp;</td><td align="middle">K</td><td align="middle">75</td><td align="middle">101 011</td><td align="middle">43</td></tr><tr><td align="middle">,</td><td align="middle">44</td><td align="middle">001 100</td><td align="middle">12</td><td>&nbsp;</td><td align="middle">L</td><td align="middle">76</td><td align="middle">101 100</td><td align="middle">44</td></tr><tr><td align="middle">-</td><td align="middle">45</td><td align="middle">001 101</td><td align="middle">13</td><td>&nbsp;</td><td align="middle">M</td><td align="middle">77</td><td align="middle">101 101</td><td align="middle">45</td></tr><tr><td align="middle">.</td><td align="middle">46</td><td align="middle">001 110</td><td align="middle">14</td><td>&nbsp;</td><td align="middle">N</td><td align="middle">78</td><td align="middle">101 110</td><td align="middle">46</td></tr><tr><td align="middle">/</td><td align="middle">47</td><td align="middle">001 111</td><td align="middle">15</td><td>&nbsp;</td><td align="middle">O</td><td align="middle">79</td><td align="middle">101 111</td><td align="middle">47</td></tr><tr><td align="middle">0</td><td align="middle">48</td><td align="middle">010 000</td><td align="middle">16</td><td>&nbsp;</td><td align="middle">P</td><td align="middle">80</td><td align="middle">110 000</td><td align="middle">48</td></tr><tr><td align="middle">1</td><td align="middle">49</td><td align="middle">010 001</td><td align="middle">17</td><td>&nbsp;</td><td align="middle">Q</td><td align="middle">81</td><td align="middle">110 001</td><td align="middle">49</td></tr><tr><td align="middle">2</td><td align="middle">50</td><td align="middle">010 010</td><td align="middle">18</td><td>&nbsp;</td><td align="middle">R</td><td align="middle">82</td><td align="middle">110 010</td><td align="middle">50</td></tr><tr><td align="middle">3</td><td align="middle">51</td><td align="middle">010 011</td><td align="middle">19</td><td>&nbsp;</td><td align="middle">S</td><td align="middle">83</td><td align="middle">110 011</td><td align="middle">51</td></tr><tr><td align="middle">4</td><td align="middle">52</td><td align="middle">010 100</td><td align="middle">20</td><td>&nbsp;</td><td align="middle">T</td><td align="middle">84</td><td align="middle">110 100</td><td align="middle">52</td></tr><tr><td align="middle">5</td><td align="middle">53</td><td align="middle">010 101</td><td align="middle">21</td><td>&nbsp;</td><td align="middle">U</td><td align="middle">85</td><td align="middle">110 101</td><td align="middle">53</td></tr><tr><td align="middle">6</td><td align="middle">54</td><td align="middle">010 110</td><td align="middle">22</td><td>&nbsp;</td><td align="middle">V</td><td align="middle">86</td><td align="middle">110 110</td><td align="middle">54</td></tr><tr><td align="middle">7</td><td align="middle">55</td><td align="middle">010 111</td><td align="middle">23</td><td>&nbsp;</td><td align="middle">W</td><td align="middle">87</td><td align="middle">110 111</td><td align="middle">55</td></tr><tr><td align="middle">8</td><td align="middle">56</td><td align="middle">011 000</td><td align="middle">24</td><td>&nbsp;</td><td align="middle">X</td><td align="middle">88</td><td align="middle">111 000</td><td align="middle">56</td></tr><tr><td align="middle">9</td><td align="middle">57</td><td align="middle">011 001</td><td align="middle">25</td><td>&nbsp;</td><td align="middle">Y</td><td align="middle">89</td><td align="middle">111 001</td><td align="middle">57</td></tr><tr><td align="middle">:</td><td align="middle">58</td><td align="middle">011 010</td><td align="middle">26</td><td>&nbsp;</td><td align="middle">Z</td><td align="middle">90</td><td align="middle">111 010</td><td align="middle">58</td></tr><tr><td align="middle">;</td><td align="middle">59</td><td align="middle">011 011</td><td align="middle">27</td><td>&nbsp;</td><td align="middle">[</td><td align="middle">91</td><td align="middle">111 011</td><td align="middle">59</td></tr><tr><td align="middle">&lt;</td><td align="middle">60</td><td align="middle">011 100</td><td align="middle">28</td><td>&nbsp;</td><td align="middle">\</td><td align="middle">92</td><td align="middle">111 100</td><td align="middle">60</td></tr><tr><td align="middle">=</td><td align="middle">61</td><td align="middle">011 101</td><td align="middle">29</td><td>&nbsp;</td><td align="middle">]</td><td align="middle">93</td><td align="middle">111 101</td><td align="middle">61</td></tr><tr><td align="middle">&gt;</td><td align="middle">62</td><td align="middle">011 110</td><td align="middle">30</td><td>&nbsp;</td><td align="middle">^</td><td align="middle">94</td><td align="middle">111 110</td><td align="middle">62</td></tr><tr><td align="middle">?</td><td align="middle">63</td><td align="middle">011 111</td><td align="middle">31</td><td>&nbsp;</td><td align="middle">_</td><td align="middle">95</td><td align="middle">111 111</td><td align="middle">63</td></tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td align="middle">`</td><td align="middle">96</td><td align="middle">(1) 000 000</td><td align="middle">64</td></tr></tbody></table>
</pre>
</blockquote>
<p><strong>UUencode编码转换过程</strong></p>
<blockquote><pre><table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center"><tbody><tr><td>原始字符</td><td colspan="8">C</td><td colspan="8">a</td><td colspan="8">t</td></tr><tr><td>原始ASCII码（十进制）</td><td colspan="8">67</td><td colspan="8">97</td><td colspan="8">116</td></tr><tr><td>ASCII码（二进制）</td><td>0</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>1</td><td>0</td><td>1</td><td>1</td><td>0</td><td>0</td><td>0</td><td>0</td><td>1</td><td>0</td><td>1</td><td>1</td><td>1</td><td>0</td><td>1</td><td>0</td><td>0</td></tr><tr><td>新的十进制数值</td><td colspan="6">16</td><td colspan="6">54</td><td colspan="6">5</td><td colspan="6">52</td></tr><tr><td>+32</td><td colspan="6">48</td><td colspan="6">86</td><td colspan="6">37</td><td colspan="6">84</td></tr><tr><td>编码后的Uuencode字符</td><td colspan="6">0</td><td colspan="6">V</td><td colspan="6">%</td><td colspan="6">T</td></tr></tbody></table></pre>
<pre>字符串：'Cat‘ 编码后是：oV%T</pre>
</blockquote>
<p><strong>UUencode PHP实现过程</strong></p>
<p>编码转换过程，与Base64类似！下面代码是实现过程，我们可以看看转换方法！</p>
<blockquote><pre class="brush: php; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;">/**
 *uuencode编码*
 *@author 程默
 *@copyright http://blog.chacuo.net/
 *@param string $src 待处理字符串
 *@return string encode编码完字符串
 */
function c_uu_encode($src)
{
	///每次读取3个字节
	$lbyte = 3;
	////将原始的3个字节转换为4个字节
	$slen=strlen($src);
	$smod = ($slen%$lbyte);
	$snum = floor($slen/$lbyte);


	$desc = array();
	
	//将剩下字节以0字节补齐
	$src = $smod===0?$src:$src.str_repeat("\0",$lbyte-$smod);
	$snum = $smod===0?$snum:$snum+1;

	for($i=0;$i&lt;$snum;$i++)
	{
		////读取3个字节
		$_arr = array_map('ord',str_split(substr($src,$i*$lbyte,$lbyte)));

		///计算每一个6位值
		$_dec = array();
		$_dec[]=$_arr[0]&gt;&gt;2;
		$_dec[]=(($_arr[0]&amp;3)&lt;&lt;4)|($_arr[1]&gt;&gt;4);
		$_dec[]=(($_arr[1]&amp;0xF)&lt;&lt;2)|($_arr[2]&gt;&gt;6);
		$_dec[]=$_arr[2]&amp;63;
		
		///对每个6位值加上32，读取ascii码 如果6位值是0，以字符"`"代替
		foreach ($_dec as &amp;$v)
		{
			$v = $v===0?'`':chr($v+32);
		}
		$desc = array_merge($desc,$_dec);
	}
	//return implode('',$desc);
	
	///以上代码只是进行转换，没有进一步进行
	//每60个编码输出（相当于45个输入字节）将输出为独立的一行，每行的开头会加上长度字符，除了最后一行之外，长度字符都应该是'M'这个ASCII字符（77=32+45），最后一行的长度字符为32+剩下的字节数目这个ASCII字符。
	$abyte = 60;
	$crlf = "\r\n";
	$alen = count($desc);
	$anum = floor($alen/$abyte);
	$amod = ($alen%$abyte);
	
	$adesc = array();
	
	for ($i=0;$i&lt;$anum;$i++)
	{
		$adesc[]='M'.implode('',array_slice($desc,$i*$abyte,$abyte)).$crlf;
	}
	
	///截取后面剩余数组长度
	if($amod!==0)
	{
		///以下计算不满45字节编码情况
		$adesc[]=chr($amod/4*3+32+($smod?$smod-$lbyte:$smod)).implode('',array_slice($desc,-$amod)).$crlf;
	}
	
	return implode('',$adesc);	
}</pre>
<p>&nbsp;</p>
</blockquote>
<p>以上只是按照转换过程，通过PHP代码实现方法！目前PHP没有UUencode转换模块！</p>
<blockquote>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/08/image.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="UUencode编码" border="0" alt="UUencode编码" src="http://blog.chacuo.net/wp-content/uploads/2013/08/image_thumb.png" width="712" height="208"></a> </p>
<p><a href="http://blog.chacuo.net/wp-content/uploads/2013/08/image1.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="UUencode编码" border="0" alt="UUencode编码" src="http://blog.chacuo.net/wp-content/uploads/2013/08/image_thumb1.png" width="714" height="409"></a> </p>
<p>该代码转换结果，跟使用工具转换结果一致。我查看了线上一些转换方法，很多结果不一致！最好，大家使用在线工具转换前，做一下比较！没有做过验证的代码，可能会给你带来麻烦！欢迎分享你的方法！</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/753.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Base64 编码介绍、Base64编码转换原理、算法</title>
		<link>http://blog.chacuo.net/719.html</link>
		<comments>http://blog.chacuo.net/719.html#comments</comments>
		<pubDate>Tue, 30 Jul 2013 12:29:19 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[base64]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=719</guid>
		<description><![CDATA[Base64编码，是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方 [...]]]></description>
				<content:encoded><![CDATA[<p>Base64编码，是我们程序开发中经常使用到的编码方法。它是一种基于用64个可打印字符来表示二进制数据的表示方法。它通常用作存储、传输一些二进制数据编码方法！也是MIME（多用途互联网邮件扩展，主要用作电子邮件标准）中一种可打印字符表示二进制数据的常见编码方法！它其实只是定义用可打印字符传输内容一种方法，并不会产生新的字符集！有时候，我们学习转换的思路后，我们其实也可以结合自己的实际需要，构造一些自己接口定义编码方式。好了，我们一起看看，它的转换思路吧！</p>
<p><strong>Base64实现转换原理</strong></p>
<p>它是用64个可打印字符表示二进制所有数据方法。由于2的6次方等于64，所以可以用每6个位元为一个单元，对应某个可打印字符。我们知道三个字节有24个位元，就可以刚好对应于4个Base64单元，即3个字节需要用4个Base64的可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ，这样共有62个字符，此外两个可打印符号在不同的系统中一般有所不同。但是，我们经常所说的Base64另外2个字符是：“+/”。这64个字符，所对应表如下。</p>
<blockquote><table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center">
<tbody>
<tr>
<th scope="col">编号</th>
<th scope="col">字符</th>
<th rowspan="18">&nbsp;</th>
<th scope="col">编号</th>
<th scope="col">字符</th>
<th rowspan="18">&nbsp;</th>
<th scope="col">编号</th>
<th scope="col">字符</th>
<th rowspan="18">&nbsp;</th>
<th scope="col">编号</th>
<th scope="col">字符</th>
</tr>
<tr>
<td>0</td>
<td>A</td>
<td>16</td>
<td>Q</td>
<td>32</td>
<td>g</td>
<td>48</td>
<td>w</td>
</tr>
<tr>
<td>1</td>
<td>B</td>
<td>17</td>
<td>R</td>
<td>33</td>
<td>h</td>
<td>49</td>
<td>x</td>
</tr>
<tr>
<td>2</td>
<td>C</td>
<td>18</td>
<td>S</td>
<td>34</td>
<td>i</td>
<td>50</td>
<td>y</td>
</tr>
<tr>
<td>3</td>
<td>D</td>
<td>19</td>
<td>T</td>
<td>35</td>
<td>j</td>
<td>51</td>
<td>z</td>
</tr>
<tr>
<td>4</td>
<td>E</td>
<td>20</td>
<td>U</td>
<td>36</td>
<td>k</td>
<td>52</td>
<td>0</td>
</tr>
<tr>
<td>5</td>
<td>F</td>
<td>21</td>
<td>V</td>
<td>37</td>
<td>l</td>
<td>53</td>
<td>1</td>
</tr>
<tr>
<td>6</td>
<td>G</td>
<td>22</td>
<td>W</td>
<td>38</td>
<td>m</td>
<td>54</td>
<td>2</td>
</tr>
<tr>
<td>7</td>
<td>H</td>
<td>23</td>
<td>X</td>
<td>39</td>
<td>n</td>
<td>55</td>
<td>3</td>
</tr>
<tr>
<td>8</td>
<td>I</td>
<td>24</td>
<td>Y</td>
<td>40</td>
<td>o</td>
<td>56</td>
<td>4</td>
</tr>
<tr>
<td>9</td>
<td>J</td>
<td>25</td>
<td>Z</td>
<td>41</td>
<td>p</td>
<td>57</td>
<td>5</td>
</tr>
<tr>
<td>10</td>
<td>K</td>
<td>26</td>
<td>a</td>
<td>42</td>
<td>q</td>
<td>58</td>
<td>6</td>
</tr>
<tr>
<td>11</td>
<td>L</td>
<td>27</td>
<td>b</td>
<td>43</td>
<td>r</td>
<td>59</td>
<td>7</td>
</tr>
<tr>
<td>12</td>
<td>M</td>
<td>28</td>
<td>c</td>
<td>44</td>
<td>s</td>
<td>60</td>
<td>8</td>
</tr>
<tr>
<td>13</td>
<td>N</td>
<td>29</td>
<td>d</td>
<td>45</td>
<td>t</td>
<td>61</td>
<td>9</td>
</tr>
<tr>
<td>14</td>
<td>O</td>
<td>30</td>
<td>e</td>
<td>46</td>
<td>u</td>
<td>62</td>
<td>+</td>
</tr>
<tr>
<td>15</td>
<td>P</td>
<td>31</td>
<td>f</td>
<td>47</td>
<td>v</td>
<td>63</td>
<td>/</td>
</tr>
</tbody>
</table>
</blockquote>
<p><strong>Base64编码转换算法、转换原理</strong></p>
<blockquote><p>转换的时候，将三个byte的数据，先后放入一个24bit的缓冲区中，先来的byte占高位。数据不足3byte的话，于缓冲区中剩下的bit用0补足。然后，每次取出6个bit，按照其值选择<code><br />ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/</code>中的字符作为编码后的输出。不断进行，直到全部输入数据转换完成。
<p>如果最后剩下两个输入数据，在编码结果后加1个“=”；如果最后剩下一个输入数据，编码结果后加2个“=”；如果没有剩下任何数据，就什么都不要加，这样才可以保证资料还原的正确性。
<p>编码后的数据比原始数据略长，为原来的4/3。无论什么样的字符都会全部被编码，因此不像<a href="http://blog.chacuo.net/494.html">Quoted-printable</a> 编码，还保留部分可打印字符。所以，它的可读性不如<a href="http://blog.chacuo.net/494.html">Quoted-printable</a> 编码！</p>
<p>
<table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center">
<tbody>
<tr>
<th scope="row">文本</th>
<td colspan="8" align="middle"><b>M</b></td>
<td colspan="8" align="middle"><b>a</b></td>
<td colspan="8" align="middle"><b>n</b></td>
</tr>
<tr>
<th scope="row">ASCII编码</th>
<td colspan="8" align="middle">77</td>
<td colspan="8" align="middle">97</td>
<td colspan="8" align="middle">110</td>
</tr>
<tr>
<th scope="row">二进制位</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>
<tr>
<th scope="row">索引</th>
<td colspan="6" align="middle">19</td>
<td colspan="6" align="middle">22</td>
<td colspan="6" align="middle">5</td>
<td colspan="6" align="middle">46</td>
</tr>
<tr>
<th scope="row">Base64编码</th>
<td colspan="6" align="middle"><b>T</b></td>
<td colspan="6" align="middle"><b>W</b></td>
<td colspan="6" align="middle"><b>F</b></td>
<td colspan="6" align="middle"><b>u</b></td>
</tr>
</tbody>
</table>
<p>M的Ascii码是77,前六位对应值为19，对应base64字符是T，如此类推。其它字符编码就可以自动转换得到！我们看看另外不是刚好是3个字节的情况！</p>
<p>&nbsp;</p>
<p>
<table class="table" border="1" rules="all" cellspacing="0" width="80%" align="center">
<tbody>
<tr>
<th scope="row">文本（1 Byte）</th>
<td colspan="8" align="middle"><b>A</b></td>
<td colspan="8" align="middle">&nbsp;</td>
<td colspan="8" align="middle">&nbsp;</td>
</tr>
<tr>
<th scope="row">二进制位</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<th scope="row">二进制位（补0）</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td><b>0</b></td>
<td><b>0</b></td>
<td><b>0</b></td>
<td><b>0</b></td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
</tr>
<tr>
<th scope="row">Base64编码</th>
<td colspan="6" align="middle"><b>Q</b></td>
<td colspan="6" align="middle"><b>Q</b></td>
<td colspan="6" align="middle"><strong>=</strong></td>
<td colspan="6" align="middle"><strong>=</strong></td>
</tr>
<tr>
<th scope="row">文本（2 Byte）</th>
<td colspan="8" align="middle"><b>B</b></td>
<td colspan="8" align="middle"><b>C</b></td>
<td colspan="8" align="middle">&nbsp;</td>
</tr>
<tr>
<th scope="row">二进制位</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td>&nbsp;</td>
<td>&nbsp;</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
<tr>
<th scope="row">二进制位（补0）</th>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>1</td>
<td>1</td>
<td><b>0</b></td>
<td><b>0</b></td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
<td>x</td>
</tr>
<tr>
<th scope="row">Base64编码</th>
<td colspan="6" align="middle"><b>Q</b></td>
<td colspan="6" align="middle"><b>k</b></td>
<td colspan="6" align="middle"><b>M</b></td>
<td colspan="6" align="middle">&nbsp;<strong>=</strong></td>
</tr>
</tbody>
</table>
</blockquote>
<p><strong>Base64转换代码实现</strong></p>
<p>既然知道了方法，那么我们如果要自己写个简单转换，好像也是很容易的！下面，我写下我做转换php代码！</p>
<blockquote><p>&nbsp;
<pre class="brush: php; auto-links: true; collapse: false; first-line: 1; gutter: true; html-script: false; light: false; ruler: true; smart-tabs: true; tab-size: 4; toolbar: true;">/**
 *base64编码方法、本方法只是做base64转换过程代码举例说明，通过该例子可以任意改造不同语言版
 *@author 程默
 *@copyright http://blog.chacuo.net
 *@param $src 原字符串
 *@return string base64字符串*
 */
function c_base64_encode($src)
{
	static $base="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	
	////将原始的3个字节转换为4个字节
	$slen=strlen($src);
	$smod = ($slen%3);
	$snum = floor($slen/3);
	
	
	$desc = array();
	
	for($i=0;$i&lt;$snum;$i++)
	{
		////读取3个字节
		$_arr = array_map('ord',str_split(substr($src,$i*3,3)));
		
		///计算每一个base64值
		$_dec0= $_arr[0]&gt;&gt;2;
		$_dec1= (($_arr[0]&amp;3)&lt;&lt;4)|($_arr[1]&gt;&gt;4);
		$_dec2= (($_arr[1]&amp;0xF)&lt;&lt;2)|($_arr[2]&gt;&gt;6);	
		$_dec3= $_arr[2]&amp;63;

		$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$base[$_dec2],$base[$_dec3]));
	}
	
	if($smod==0) return implode('',$desc);
	
	///计算非3倍数字节
	$_arr = array_map('ord',str_split(substr($src,$snum*3,3)));
	$_dec0= $_arr[0]&gt;&gt;2;
	///只有一个字节
	if(!isset($_arr[1]))
	{
		$_dec1= (($_arr[0]&amp;3)&lt;&lt;4);
		$_dec2=$_dec3="=";
	}
	else 
	{
		///2个字节
		$_dec1= (($_arr[0]&amp;3)&lt;&lt;4)|($_arr[1]&gt;&gt;4);
		$_dec2= $base[($_arr[1]&amp;7)&lt;&lt;2];
		$_dec3="=";
	}
	$desc = array_merge($desc,array($base[$_dec0],$base[$_dec1],$_dec2,$_dec3));
	return implode('',$desc);
}</pre>
</blockquote>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/07/image9.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="base64编码转换原理" border="0" alt="base64编码转换原理" src="http://blog.chacuo.net/wp-content/uploads/2013/07/image_thumb9.png" width="825" height="459"></a> </pre>
</blockquote>
<p>好了，通过这个例子，我想base64编码转换原理、算法有些了解了吧！它转换过程很简单，只需要做个映射表，然后将原先做一些移位运算就可以完成！我们通过该例子，是不是可以做个自己的base32这类的编码呢！欢迎朋友们交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/719.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quoted-printable 编码介绍、编码解码转换</title>
		<link>http://blog.chacuo.net/494.html</link>
		<comments>http://blog.chacuo.net/494.html#comments</comments>
		<pubDate>Wed, 24 Jul 2013 11:59:18 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[quoted-printable]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=494</guid>
		<description><![CDATA[Quoted-printable 可译为“可打印字符引用编码”、“使用可打印字符的编码”，我们收邮件，查看信件 [...]]]></description>
				<content:encoded><![CDATA[<p>Quoted-printable 可译为“可打印字符引用编码”、“使用可打印字符的编码”，我们收邮件，查看信件原始信息，经常会看到这种类型的编码！</p>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/07/image8.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Quoted-printable编码" border="0" alt="Quoted-printable编码" src="http://blog.chacuo.net/wp-content/uploads/2013/07/image_thumb8.png" width="547" height="296"></a></pre>
<pre>最多时候，我们在邮件头里面能够看到这样的编码！Content-Transfer-Encoding:quoted-printable</pre>
<pre>&nbsp;</pre>
</blockquote>
<p>它是<b>多用途互联网邮件扩展</b>（MIME) 一种实现方式。其中MIME是一个互联网标准，它扩展了电子邮件标准，致力于使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。目前http协议中，很多采用MIME框架！quoted-printable 就是说用一些可打印常用字符，表示一个字节（8位）中所有非打印字符方法！</p>
<p><strong>Quoted-printable编码方法</strong></p>
<blockquote>
<p>任何一个8位的字节值可编码为3个字符：一个等号&#8221;=&#8221;后跟随两个十六进制数字(0–9或A–F)表示该字节的数值.例如，ASCII码换页符（十进制值为12）可以表示为&#8221;=0C&#8221;, 等号&#8221;=&#8221;（十进制值为61）必须表示为&#8221;=3D&#8221;. 除了可打印ASCII字符与换行符以外，所有字符必须表示为这种格式.</p>
<p>所有可打印ASCII字符(十进制值的范围为33到126)可用ASCII字符编码来直接表示, 但是等号&#8221;=&#8221;(十进制值为61)不可以这样直接表示.ASCII的水平制表符(tab)与空格符, 十进制为9和32, 如果不出现在行尾则可以用其ASCII字符编码直接表示。如果这两个字符出现在行尾，必须QP编码表示为&#8221;=09&#8243; (tab)或&#8221;=20&#8243; (space).</p>
<p>如果数据中包含有意义的行结束标志，必须转换为ASCII回车(CR)换行(LF)序列，既不能用原来的ASCII字符也不能用QP编码的&#8221;=&#8221;转义字符序列。 相反，如果字节值13与10有其它的不是行结束的含义，它们必须QP编码为=0D与=0A.</p>
<p>quoted-printable编码的数据的每行长度不能超过76个字符. 为满足此要求又不改变被编码文本，在QP编码结果的每行末尾加上软换行(soft line break). 即在每行末尾加上一个&#8221;=&#8221;, 但并不会出现在解码得到的文本中. </p>
<p>例如：If you believe that truth=beauty, then surely mathematics is the most beautiful branch of philosophy. 编码后结果是</p>
<pre>If you believe that truth=3Dbeauty, then surely=20=
mathematics is the most beautiful branch of philosophy.</pre>
</blockquote>
<p>编码里面，有几个特定限定，一些可打印字符不用编码，当然如果你按照规范编码后，也一样可以显示的！因此自己简单自己实现该编码:</p>
<blockquote><pre>function quoted_printable_encode($string) { <br />&nbsp;&nbsp;&nbsp; return preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%","=",<br />rawurlencode($string))); <br />} </pre>
<p>一个函数就可以，将所有字符串urlencode转换后，%号替换为”=”号，然后对非\r\n超过73连续字符，后面加一个=\r\n。这个是简单实现方法！ 按照该编码详细说明里面，有些空格、换行，还有一些特殊字符可以不用转换。不过一起转换了，也不会有影响！</p>
</blockquote>
<p>很多时候，我们用些常见字符表示所有8位其它非打印字符，这种通过，Quoted-printable编码，只是对该字节转为16进制后，做简单增加前缀！然后做些特殊字符处理即可！ 它的简单，及编码高效，也让该编码在邮件格式里面，得到了广泛使用！好了，就到这里，欢迎交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/494.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ISO-8859-1 、Latin-1 西欧编码介绍及应用</title>
		<link>http://blog.chacuo.net/371.html</link>
		<comments>http://blog.chacuo.net/371.html#comments</comments>
		<pubDate>Fri, 19 Jul 2013 11:47:21 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[iso-8859-1]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=371</guid>
		<description><![CDATA[这些编码，早些时候在一些应用软件中经常看到，估计很多朋友也看到了，这些编码了！ 从这个图，我们可以看到这类编码 [...]]]></description>
				<content:encoded><![CDATA[<p>这些编码，早些时候在一些应用软件中经常看到，估计很多朋友也看到了，这些编码了！</p>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/07/image4.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="iso-8859-1字符集应用" border="0" alt="iso-8859-1字符集应用" src="http://blog.chacuo.net/wp-content/uploads/2013/07/image_thumb4.png" width="900" height="392"></a> </pre>
<p>从这个图，我们可以看到这类编码应用很广泛，那么我们一起看看，iso-8859-1字符集，到底是什么样字符集，有那些字符！为什么，它应用可以这么广泛！</p>
</blockquote>
<p>计算机上面流行第一个字符集，是ascii码，是0-127 一个128字符。每个字符在里面有个对应编号，分别是0-127。如果用二进制表示，刚好是7位。这个字符集，在前期表示英文字符已经足够。后来，随着计算机普及，越来越多国家（欧洲），开始应用计算机，他们发现7位，共128字符。已经不能描述他们常用的字符了。因此想到要兼容ascii字符集，就指定了扩展ASCII字符集。最多是0-255,256个字符。其中0-127 128字符及位置编码 完全兼容ascii码。只是扩展了128-255位置编入了新字符！</p>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/07/image7.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="iso-8859-1字符集" border="0" alt="iso-8859-1字符集" src="http://blog.chacuo.net/wp-content/uploads/2013/07/image_thumb7.png" width="864" height="677"></a> </pre>
<p>该字符集，完全兼容ascii字符集，并且是刚好可以用一个字节表示里面所有字符位置。又称为扩展Ascii码！这也是第一个iso-8859-1字符集。又叫：Latin-1 编码(西欧编码)，后来陆续出了iso-8859-2…-15字符集。都是完全兼容ascii码的。</p>
<p>&nbsp;</p>
</blockquote>
<blockquote>
<p>说下几个概念吧，什么是字符集，什么是字符编码?</p>
<p>1、字符集，表示由一些指定的字符的所组成集合！ascii字符集，里面有128个字符</p>
<p>2、字符编码，每个字符集中字符，都有一个固定的编号，也叫该字符在字符集中的的编码！如：ascii字符集中，a 字符编码是97。</p>
<p>相同字符，会出现在多个字符集中吗，相同字符在不同字符集中编码一样吗？</p>
<p>从上面例子，我们可以看到，ascii字符集、iso-8859-1字符集 有128个字符相同的。经常相同的字符，可以出现在各个字符集中。但是，每个字符集对字符编号方式可能不同，因此，相同字符，在不同字符集中，编码结果可能不一样。当然，也有一样的！象ascii中所有字符编码，在iso-8859-1字符集中，都一样的。</p>
<p>&nbsp;</p>
</blockquote>
<p>弄清楚关于、字符集，字符编码概念。我们还有几个必须掌握的。就是，计算机是怎么样储存，显示字符的呢？</p>
<p>一个文件有很多符号组成，各式各样的！实际，计算机在存储时候，只是写入该字符所对应的字符编码值。将它存于磁盘或者在网络中传输！如果要显示时候，通过对应字符集中，字符编码值。然后可以转换到计算机 通用的字符集的对应字符编码。计算机每个字符形状，图像长相，都在字体中。然后，通过转换得到通用字符集的字符编码，找到对应的字符，及字体形状，然后显示出来！</p>
<blockquote><pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/07/image6.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="字符存储方式" border="0" alt="字符存储方式" src="http://blog.chacuo.net/wp-content/uploads/2013/07/image_thumb6.png" width="886" height="468"></a> </pre>
<pre><font color="#0000ff">字符在计算机存储、传输都是该字符所在字符集中编码值 </font></pre>
<pre>&nbsp;</pre>
</blockquote>
<p>好了，中间我们对字符概念做了很多的阐述、说明！下面，我们继续本页主题iso-8859-1字符集了。 它为什么能够这么广泛应用呢？</p>
<p>我们知道，单字节最多可以表示256字符，实际上很多字符（目前unicode有几十万字符），都需要用多个字节来存储！计算机在存储传输都以字节为单位！因此单字节的： iso-8859-1 是存储的最小单元。所以，无论你是多少个字节组成的字符，以单字节一个一个存储、传输！都不会改变原来的值，都可以很好保存它的值！<font color="#0000ff">计算机乱码，出现在显示的时候，在不正确的字符集中，查找对应字符编码的字符！经常是，编码选择字符集，跟做显示选择字符集不一致造成的！</font></p>
<p><p>在复制文件、传输文件不会造成字符编码问题。而出现问题时候，是字符做显示，或者将显示字符存储的时候，会出现问题！好了，这里面说的是iso-8859-1 其实，更多的是说说，字符编码的一些常识！明白这些，对于iso-8859-1的一些特点理解，可能 更容易了！</p>
<p>可能以前有朋友就问，我mysql是存中文的，为什么我选择字符集是Latin-1 ，是不是就出现乱码了。其实不会，它只是将接到任何字节，按照单字节，逐个逐个存储的。然后，读取时候，也逐个逐个字节的读出。没有改变任何保存内容，也没有做任何编码转换！这是，最为安全的！好了，就到这里了，欢迎朋友们交流！</p></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/371.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GBK字符编码（字符集）缺陷攻击（注入）原理</title>
		<link>http://blog.chacuo.net/312.html</link>
		<comments>http://blog.chacuo.net/312.html#comments</comments>
		<pubDate>Mon, 24 Jun 2013 09:38:08 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web安全]]></category>
		<category><![CDATA[GBK缺陷]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=312</guid>
		<description><![CDATA[上一节，我们分析了。选择不同编码可能会导致程序带来本身潜在的漏洞。这次我们以GBK编码为例，看看怎么样通过该编 [...]]]></description>
				<content:encoded><![CDATA[<p>上一节，我们分析了。选择不同编码可能会导致程序带来本身潜在的漏洞。这次我们以GBK编码为例，看看怎么样通过该编码注入到系统中。目前很多开源系统都存在类似的注入问题。我们先来，从一个Demo开始！</p>
<p><strong>GBK字符集漏洞注入原理</strong></p>
<blockquote>

<div class="wp_syntax"><table><tr><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$u</span><span style="color: #339933;">=</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'u'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>? <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'u'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">:</span><span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$u</span><span style="color: #339933;">=</span><span style="color: #990000;">addslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$u</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;select * from user where user='<span style="color: #006699; font-weight: bold;">$u</span>'&quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>以上是我们写的一个测试例子（GBK编码），现在很多开源系统，比较少的进行统一参数过滤，有时候为了防止注入，就直接对参数进行转义处理。我们看看，这样一个例子，我们怎么样注入进系统！</p>
</blockquote>
<blockquote>
<table class="table" border="1" rules="all" cellspacing="0" width="820" frame="box">
<thead>
<tr valign="top">
<th width="316">步骤</th>
<th width="617">备注</th>
</tr>
</thead>
<tbody>
<tr>
<td valign="top" width="316">1.传入值%D5%27 or 1=1#</td>
<td valign="top" width="617">u参数参入上面值 (%27 对应是“’”&#160; 单引号字符)</td>
</tr>
<tr>
<td valign="top" width="316">2.GET获取的值</td>
<td valign="top" width="617">0xD50x27 or 1=1# </td>
</tr>
<tr>
<td valign="top" width="316">3.Addslashes后值</td>
<td valign="top" width="617">0xD50x5C0x27 or 1=1 (意思是：誠’ or 1=1#’)&#160; #字符后面被注释掉</td>
</tr>
<tr>
<td valign="top" width="316">4.sql值 将变成</td>
<td valign="top" width="617">select * from user where user=’誠’ or 1=1#’</td>
</tr>
<tr>
<td valign="top" colspan="2">#号是sql注释符号，后面字符将截取掉</td>
</tr>
</tbody>
</table>
<pre>&#160;</pre>
<pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image44.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="GBK编码漏洞注入测试" border="0" alt="GBK编码漏洞注入测试" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb44.png" width="821" height="280" /></a> </pre>
</blockquote>
<p>GPC转义打开，或者是通过addslashes函数，会自动在字符是单引号（<i>&#8216;</i>）、双引号（<i>&quot;</i>）、反斜线（<i>\</i>）与 NUL（<b><tt>NULL</tt></b> 字符）等字符前面增加“\”字符（0x5c)，例子里面，我们采用一个特殊前面字节0xD5，它将与该字节组合变成：0xD50x5c ，刚好是gbk字符集中字符：”誠“ 了。 后面的0&#215;27这个单引号被保留下来了！</p>
<p><strong>GBK字符集漏洞注入总结</strong></p>
<p>呵呵，这个很有意思吧，好了。我们来总结下，这类注入是2个条件的。<u><font color="#0000ff">第一是：gbk编码，第二是：程序采用了转义方法，转义了输入。</font></u> 这2个条件不苛刻，目前大部分开源系统都有gbk,utf-8编码的源码，剩下的就去看看，源码里面有没有用类似转义方法，过滤字符串了。如果有，那么这个系统某个功能，你可以去渗透下了。这个编码漏洞，网上面提的很多，不过很多时候，没有引起开发人员的足够重视，还是在不断的重现！</p>
<p>那么我们如果要注入一个参数，我们该选择什么样的入参参数呢？其实这种转义字符是单引号（<i>&#8216;</i>）、双引号（<i>&quot;</i>）、反斜线（<i>\</i>）与 NUL（<b><tt>NULL</tt></b> 字符），我们这些字符往往在程序中有特殊作用，我们只需要在前面加<strong><font color="#0000ff"><u>一个在&gt;7F字符，后面接一个%27（<i>&#8216;</i>）、%22（<i>&quot;</i>）、%5C（<i>\</i>）、%00（<tt>NULL</tt> 字符）</u></font></strong>，就可以自己让这4个字符，可以逃脱转义了。</p>
<p>好了，这个漏洞原理及注入过程分析就这些了。我们开发时候，需要注意这个问题，特别是使用GBK编码开发程序，要有这个方面的预备知识，对于自己开发安全的代码会有帮助的。更多的<a title="GBK字符集" href="http://doc.chacuo.net/gbk" rel="GBK字符集" target="_blank">GBK编码</a>，可以看<a href="http://doc.chacuo.net/gbk">http://doc.chacuo.net/gbk</a> ！（这里有很多落在5c中文字符呢）也欢迎讨论！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/312.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GBK字符编码（字符集）缺陷导致web安全漏洞</title>
		<link>http://blog.chacuo.net/309.html</link>
		<comments>http://blog.chacuo.net/309.html#comments</comments>
		<pubDate>Fri, 21 Jun 2013 09:21:34 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[web安全]]></category>
		<category><![CDATA[GBK缺陷]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=309</guid>
		<description><![CDATA[很多时候，一个web站点，选择什么样的字符编码，我们不会太过在意的。象中文网站，我们一般用gb2312,gbk [...]]]></description>
				<content:encoded><![CDATA[<p>很多时候，一个web站点，选择什么样的字符编码，我们不会太过在意的。象中文网站，我们一般用gb2312,gbk,gb18030,也可以用utf-8。但是，可能我们不知道，选择不同编码，可能因此导致程序本身设计缺陷。</p>
<p><strong>多字节编码由来</strong></p>
<p>我们先来看看最常用的，最小字符集是ascii，对应的二级制可以表示为：00-7F 编码 。它也是我们计算机使用最早通用的字符集。前期几乎可以表示所有英文字符。后来，更多使用计算机国家加入后，我们就想在计算机中表示中文字符。我们知道常见中文就有7000多个字符。ascii码就只有128字符，只有0-127编码位置，远远不够用了。因此，我们就开始制作更大字符集，并且保证兼容ascii编码。要支持更多字符，选择更大字符集。我们只能用多个字节来描述一个字符了。为了很好的与ascii码，区分开来！一般做法是：每个字节值都大于&gt;7F，如果是2个字节，那么就是：[&gt;7F][&gt;7F]。这样编码，保证很好的与ascii区分开，并且扩大了字符集。像gb2312范围在[0xA1-0xF7][0xA1-0xFE](中间很多没有填满)，它完全保证所有字节在A0之上，也就完全满足在7F之上了。</p>
<p><strong>GBK编码漏洞缘由</strong></p>
<p>通过上面的分析，我们知道gb2312编码是很好的跟ascii码分开了。 那么我们看看，GBK编码呢，它是完全兼容gb2312（就是说在gb2312字符集中每个字符位置，与gbk字符集里面位置完全一致，而且包含于gb2312)，但是，它有2万多个字符。从上面看，只能选择往下排序了。 就是从A1A0往下排了，我们发现它编码实际范围是：[0x81-0xFE]([0x40-0x7E|0x80-0xFE] ) （<a title="gbk字符集" href="http://doc.chacuo.net/gbk" rel="gbk字符集" target="_blank">GBK编码</a>），我们发现由2个字节组成，首字节范围在7F之上，而第2个字节，有一部分在0&#215;40-0x7E了。这就是导致bug原因。我们看看下面例子吧！</p>
<blockquote><p><font style="background-color: #ffffff" face="Arial">从ASCII码表中，我们知道0&#215;40-0x7E 包含字符有：“<a href="mailto:&ldquo;A-Za-z@[\">A-Za-z@[\</a>]^_`{|}~”，一共有63字符呢。</font></p>
<pre><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image43.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="GBK编码漏洞" border="0" alt="GBK编码漏洞" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb43.png" width="574" height="251" /></a> </pre>
<p>选择gbk编码，运行上面代码，就一条简单的命令导致出现错误，说字符串 赋值 没有结束！ 呵呵，估计很多人看到这个就会认为是php 出Bug了。但是，如果我们变成$a=”誠a”，发现可以正常运行了。是不是觉得很奇葩啦！！</p>
<p>&#160;</p>
</blockquote>
<p>原因分析:我们知道文件存在磁盘都是二级制方式，无论你存什么字符，最终都是以<strong>该字符的在所选字符集中字符编码保存</strong>。php解析时候，最小分析单元是字节。无论你是多字节还是单字节字符。最终都是按照字节来处理的。<font color="#0000ff"><u>“誠”&#160; GBK编码是 D55C，php按字节来解释，5C对应字符是“\” 字符。后面直接跟个‘”’，相当于被转义了。 因为没有闭合，因此出现错误！</u>。</font><font color="#000000">大家看出问题所在了吧，按自己处理的话，会自然把多字节拆成单字节了。这样就会出现很多奇怪问题了。 </font></p>
<p>总结：通过上面讲解，我们知道了多字节编码过程，以及GBK导致简单程序出错的原因。其实，我们很多程序语言里面，都会以单个字节来解析的。这样，当你选择多字节GBK编码中文时，刚好有字节落在特殊位置，将会出现奇怪错误问题。而且，还将给系统带来本身的漏洞，后面我再说说，GBK编码缺陷，导致漏洞、以及专门利用该编码漏洞缺陷进行系统入侵！好了，先到这里了，欢迎交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/309.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>姓名中点字符输入思考（输入特殊字符）</title>
		<link>http://blog.chacuo.net/174.html</link>
		<comments>http://blog.chacuo.net/174.html#comments</comments>
		<pubDate>Fri, 07 Jun 2013 14:46:53 +0000</pubDate>
		<dc:creator>程默</dc:creator>
				<category><![CDATA[web原理]]></category>
		<category><![CDATA[学习心得]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[字符编码]]></category>

		<guid isPermaLink="false">http://blog.chacuo.net/?p=174</guid>
		<description><![CDATA[最近工作中，时不时有用户输入自己真实姓名，然后申请银行提款时候，遇到一些特殊字符。而输入错误，提款失败！其中最 [...]]]></description>
				<content:encoded><![CDATA[<p>最近工作中，时不时有用户输入自己真实姓名，然后申请银行提款时候，遇到一些特殊字符。而输入错误，提款失败！其中最多就是少数名字，姓名中的点字符。如：某某·李四，经常有人输入：某某.李四 或 某某・李四。其中：”·・” 这2个中间点很容易输入错误。都是中间点，一个大一个细。</p>
<ul>
<li>
<h3><font style="font-weight: bold">那一个才是中文姓名中间点呢？</font></h3>
</li>
</ul>
<p>作为技术开发人员，我们有办法知道，到底那个点才是中文中间分割点。因为，这些都是常见姓名字符，因此，我们只要检测下，这2个字符对应在gb2312字符集中，字符编码即可。对于计算机而言，无论多怪的字符，看起来还怎么像，其实计算机本质去区分，是按照字符在字符集中，对应编码（字符编码）来保存、传输的。 因此，作为技术人员，只要能够判断字符在字符集中编码，就能知道对应字符是不是相同的。</p>
<blockquote><p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image9.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb9.png" width="785" height="203" /></a></p></blockquote>
<p>从上面看，在gb2312中，第一个字符编码是a1a4,第二个字符返回是%3F，这个是”?”，其实意思是，该字符在这个字符集gb2312中找不到，就默认返回”?”，经常做大字符集，转小字符集合时候常遇到。毫无疑问，我们可以确定第一个字符才是姓名中分隔符，第二个只是看起来更象中文分隔符字符而已。后来查询，发现，其实”・”是日文中的分隔符。通过这种方法，我们其实很容易通过程序就可以查出真假“李逵”啦！</p>
<ul>
<li>
<h3><font style="font-weight: bold">怎么样快速输入相似字符呢？</font></h3>
</li>
</ul>
<p>对于技术人员，已经知道怎么样辨别真假李逵了。 那么，如果有些自己常见的字符，我要去输入，我该怎么样去做呢？查询输入中文姓名中间点，方法很多。</p>
<blockquote><p><font style="background-color: #ffffff" face="Arial">1、智能ABC状态，直接按“`”键盘</font></p>
<p><font style="background-color: #ffffff" face="Arial">2、五笔输入法按，shiftv+ @键</font></p>
<p><font style="background-color: #ffffff" face="Arial">…… </font></p>
</blockquote>
<p><font style="background-color: #ffffff" face="Arial">这里省略N多方法，方法都能很快打印出字符，但是都有各自前提条件，都跟需要安装输入法有关系。如果，选择错误输入法，又很容易将相似字符输入进入。对于，普通用户，还是很难区分。</font></p>
<p><font style="background-color: #ffffff" color="#9b00d3" face="Arial"><u>我们必须找个，统一输入法，无论什么用户都可以正确输入！</u></font></p>
<p>我们知道目前最大字符集是unicode，也叫万国码，里面可以存储100多万字符，而且几乎所有字符集中，字符都在该字符集中能够找到，那么，我们只要知道字符在该字符中编码，就可以唯一确定一个字符。 对于windows而言，目前可以快速输入unicode码字符，只需要打开锁定数字键，按住：alt + unicode字符位置编码数字（小键盘）&#160; 即可。</p>
<p>如：我们发现”·” 字符unicode编码是 183，因此只要打开数字锁定键，按住alt + 小键盘输入183&#160;&#160; 松开alt即可。问题似乎变成了，怎么样知道字符的unicode编码了。</p>
<ul>
<li>
<h3><font style="font-weight: bold">怎么样知道字符unicode编码？</font></h3>
</li>
</ul>
<p>unicode由于字符非常多，因此，常有几种实现模式，utf-8,utf-16等。都是unicode字符集一种存储编码方式。我们只需要将任意字符转换到utf-32编码即可，utf-32每个字符用4个字节表示。结果，跟unicode值一致。只是都占用4个字节而已。</p>
<blockquote>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">///当前文件选择utf-8字符集</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 *得到字符的unicode字符编码值*
 * @author QQ:8292669
 * @copyright http://blog.chacuo.net
 * @param string $char 传入单字符
 * @return int 10禁止字符值
 */</span>
<span style="color: #000000; font-weight: bold;">function</span> getUnicodeDec<span style="color: #009900;">&#40;</span><span style="color: #000088;">$char</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$c</span> <span style="color: #339933;">=</span> <span style="color: #990000;">iconv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;utf-8&quot;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;utf-32BE&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">///得到4个16进制字节</span>
	<span style="color: #b1b100;">return</span> <span style="color: #990000;">array_pop</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">unpack</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'N'</span><span style="color: #339933;">,</span><span style="color: #000088;">$c</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>   <span style="color: #666666; font-style: italic;">///16进制转换为10机制</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;·&quot;</span><span style="color: #339933;">,</span> getUnicodeDec<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'·'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;・&quot;</span><span style="color: #339933;">,</span> getUnicodeDec<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'・'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

</blockquote>
<blockquote><p><a href="http://blog.chacuo.net/wp-content/uploads/2013/06/image10.png"><img style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://blog.chacuo.net/wp-content/uploads/2013/06/image_thumb10.png" width="547" height="228" /></a></p></blockquote>
<p>从上面，我们可以看到一个用alt+183,一个用alt+12539输入。 这样看起来输入很难记住，不过，如果某个人自己姓名刚好有特殊字符，这种方法是个不错选择。你只要记住自己姓名特殊字怎么输入就行。记住后，以后无论那个电脑上面，就可以准确无误输入。呵呵，是个不错的选择！如果，我姓名里面，有难打字符。要输入：程默，分别是：alt +31243,alt + 40664 就可以了。</p>
<p>后记：从技术角度分析下，其实我们遇到这类问题，都可以方便甄别，也可以有个一劳永逸的办法。当然，没有特殊难输入字符，完全没有必要去记录编码啦。 好了，就这里，欢迎朋友们交流！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.chacuo.net/174.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
