<?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>编程之路总结 &#8211; 编程技术记录</title>
	<atom:link href="https://blog.z6z8.cn/category/%E7%BC%96%E7%A8%8B%E4%B9%8B%E8%B7%AF%E6%80%BB%E7%BB%93/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.z6z8.cn</link>
	<description>世界你好!</description>
	<lastBuildDate>Tue, 17 Dec 2019 07:45:06 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>
	<item>
		<title>编程之路总结：加密与解密&#8211;RSA要点</title>
		<link>https://blog.z6z8.cn/2019/12/17/%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%b7%af%e6%80%bb%e7%bb%93%ef%bc%9a%e5%8a%a0%e5%af%86%e4%b8%8e%e8%a7%a3%e5%af%86-rsa%e8%a6%81%e7%82%b9/</link>
					<comments>https://blog.z6z8.cn/2019/12/17/%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%b7%af%e6%80%bb%e7%bb%93%ef%bc%9a%e5%8a%a0%e5%af%86%e4%b8%8e%e8%a7%a3%e5%af%86-rsa%e8%a6%81%e7%82%b9/#respond</comments>
		
		<dc:creator><![CDATA[holdsky]]></dc:creator>
		<pubDate>Tue, 17 Dec 2019 07:45:06 +0000</pubDate>
				<category><![CDATA[编程之路总结]]></category>
		<guid isPermaLink="false">http://blog.z6z8.cn/?p=653</guid>

					<description><![CDATA[RSA加密算法是一种非对称加密算法. 对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之，对一极大整数 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>RSA加密算法是一种非对称加密算法. 对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之，对一极大整数做因数分解愈困难，RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话，那么用RSA加密的信息的可靠性就肯定会极度下降。</p>
<h1>密钥</h1>
<p>RSA为非对称加密算法，密钥分为私钥和公钥。<br />
其中，公钥可以由私钥导出（意思就是，拥有私钥，也就拥有了公钥），而公钥不能导出私钥。</p>
<h2>密钥存储格式</h2>
<p>比较常用的格式有ASN1.DER 和 PEM</p>
<ul>
<li>ASN1.DER 是公钥或者私钥的采用ASN1.DER方式序列化，其结果是一串二进制数据</li>
<li>PEM 为Base64格式的文本，主要内容为ASN1.DER数据的Base64表达。另外，PEM允许使用指定的对称加密算法将加密，如DES等。</li>
</ul>
<pre><code>PEM格式的样例，中间的Base64文本其实就是ASN1.DER的Base64表示

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDA04KNnZEBO3Ajk+nI4x/VKdoL
F+yNv/KI0wCNF1J9do8Ra+MXUdDr+Nbehf6JYLuwHfur2mhw0gTT9lTLM2mD0qHo
rbMs/XtSbXc9eP3xwJ/hU0V76LqtKw+y7GSgJ9XiyWS848DO2fV7uHdpwgRWCfHu
R8fcUO0SrOHLj5g1HwIDAQAB
-----END PUBLIC KEY-----
</code></pre>
<h2>密钥长度</h2>
<p>密钥长度越长，安全性越好，加密解密所需时间越长。<br />
RSA长度有512、1024 、 2048 、 4096，一般使用时的最低长度为1024。</p>
<p>参考<a href="https://blog.csdn.net/liwei16611/article/details/83751851" title="文章">文章</a>，密钥长度增长一倍，公钥操作所需时间增加约 4 倍，私钥操作所需时间增加约 8 倍，公私钥生成时间约增长 16 倍。</p>
<h1>加密与解密</h1>
<p>RSA的加密密钥可以是公钥、也可以是私钥；解密亦然。</p>
<ul>
<li>公钥加密，私钥解密</li>
<li>私钥加密，公钥解密</li>
</ul>
<h2>块加密与补全模式</h2>
<p>RSA也是一种分块加密算法，单次加密长度的上限时密钥长度，而当RSA使用PKCS1 补全模式时， padding 占用了 11 个字节，因此单次计算块长度约束<br />
<code>待加密的字节数不能超过密钥的比特长度值除以 8 再减去 11</code></p>
<pre><code>例如，密钥长度是1024比特，那么单次块最大长度
(1024 / 8 -11) = 117 字节</code></pre>
<h1>签名与验签</h1>
<p>对于非对称加密算法来说，除了常规的加解密外，还可以用来签名与验签。</p>
<ul>
<li>签名用私钥</li>
<li>验签用公钥</li>
</ul>
<p>另外，就RSA来讲，签名的摘要算法可以使用<code>MD5</code>、<code>SHA1</code>、<code>SHA2系列（如SHA256）</code></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.z6z8.cn/2019/12/17/%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%b7%af%e6%80%bb%e7%bb%93%ef%bc%9a%e5%8a%a0%e5%af%86%e4%b8%8e%e8%a7%a3%e5%af%86-rsa%e8%a6%81%e7%82%b9/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>编程之路总结：加密与解密</title>
		<link>https://blog.z6z8.cn/2019/12/13/%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%b7%af%e6%80%bb%e7%bb%93%ef%bc%9a%e5%8a%a0%e5%af%86%e4%b8%8e%e8%a7%a3%e5%af%86%ef%bc%88%e4%b8%80%ef%bc%89/</link>
					<comments>https://blog.z6z8.cn/2019/12/13/%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%b7%af%e6%80%bb%e7%bb%93%ef%bc%9a%e5%8a%a0%e5%af%86%e4%b8%8e%e8%a7%a3%e5%af%86%ef%bc%88%e4%b8%80%ef%bc%89/#respond</comments>
		
		<dc:creator><![CDATA[holdsky]]></dc:creator>
		<pubDate>Fri, 13 Dec 2019 06:43:27 +0000</pubDate>
				<category><![CDATA[编程之路总结]]></category>
		<guid isPermaLink="false">http://blog.z6z8.cn/?p=614</guid>

					<description><![CDATA[先摘录一段百度百科的文字: 密码学（在西欧语文中，源于希腊语kryptós“隐藏的”，和gráphein“书写 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>先摘录一段百度百科的文字:<br />
<code>密码学（在西欧语文中，源于希腊语kryptós“隐藏的”，和gráphein“书写”）是研究如何隐密地传递信息的学科.</code></p>
<p>密码学的历史很长，人类使用密码的历史几乎与使用文字的时间一样长。古典密码学、近代密码学、现代密码学......详细请阅读<a href="https://blog.csdn.net/jiang_xinxing/article/details/89360638" title="这里">这里</a></p>
<p>在现代，密码技术大部分都和计算机紧密相关，因为计算了实在是太大了。做过基础应用开发的话，一般会对密码工具或加密工具有所了解，接触一些<code>CryptoXXX</code>或<code>XXXCrypto</code>工具库。Crypto是不是和希腊语kryptós很像？<img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f604.png" alt="😄" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f604.png" alt="😄" class="wp-smiley" style="height: 1em; max-height: 1em;" /><img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f604.png" alt="😄" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>好了，说些我懂的吧。我从软件编程的角度谈下自己的体会。</p>
<h1>算法分类</h1>
<p>在学习和使用Crypto类的加解密工具库时，尤其是在查看和使用其提供API时，要明白这后面对应的是什么算法、在什么场景下使用。<br />
当前，我们常用的算法可以分为三类：</p>
<ul>
<li>摘要算法，也称散列、哈希算法，也有叫做单向加密算法的。严格来说，这不是加密算法----摘要算法是一种操作不可逆的算法，不能反向解密出原始数据。它应用的场景往往是完整性、真实性校验，例如数字签名。</li>
<li>对称加密算法。指加密和解密的密钥都是同一个，通常是加密方和解密方预先共同约定一个密钥。在非对称加密算法</li>
<li>非对称加密算法，公钥加密算法。这和对称加密算法相对应，指加密密钥和解密密钥不是同一个。著名的应用场景就是TLS/SSL（HTTPS的<code>S</code>指的是TLS/SSL）</li>
</ul>
<h1>摘要（Digest）</h1>
<p>也叫杂凑、哈希；就是把任意长度的输入，通过散列算法，变换成固定长度的输出，该输出就是散列值。这种转换是一种压缩映射，也就是，散列值的空间通常远小于输入的空间，不同的输入可能会散列成相同的输出，而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。例如MD5是将数据散列到128比特（16字节）上。</p>
<h2>MD5</h2>
<p>英文 MD5 Message-Digest Algorithm. 是第5代摘要算法，前面还有MD2、MD4。</p>
<p>MD5由美国密码学家罗纳德·李维斯特（Ronald Linn Rivest）设计，于1992年公开，用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点，可以被加以破解，对于需要高度安全性的数据，专家一般建议改用其他算法，如SHA-2。2004年，证实MD5算法无法防止碰撞（collision），因此不适用于安全性认证，如SSL公开密钥认证或是数字签名等用途。--摘自百度百科。</p>
<table>
<thead>
<tr>
<th>算法</th>
<th>输入</th>
<th>单次计算块</th>
<th>输出</th>
</tr>
</thead>
<tbody>
<tr>
<td>MD2</td>
<td>任意数据，包括空数据</td>
<td>512比特（64字节）</td>
<td>128比特（16字节）</td>
</tr>
<tr>
<td>MD4</td>
<td>任意数据，包括空数据</td>
<td>512比特（64字节）</td>
<td>128比特（16字节）</td>
</tr>
<tr>
<td>MD5</td>
<td>任意数据，包括空数据</td>
<td>512比特（64字节）</td>
<td>128比特（16字节）</td>
</tr>
</tbody>
</table>
<p><code>MD5的计算结果不存在32位、16位之分，其结果就是16字节、128比特。32位、16位之说是极其不专业的。</code></p>
<p>MD5已经被证明不安全，但这并不影响我们继续使用，只需要我们将应用范围缩小到不涉及安全方面就可以了。<br />
例如，</p>
<ul>
<li>我们仍然可以使用MD5来校验非核心文件的完整性。</li>
<li>用MD5将URL映射到本地文件名，以帮助实现缓存功能。（通常在客户端使用MD5时，是不考虑MD5的碰撞概率的）。</li>
</ul>
<h2>SHA系列</h2>
<p>英语 Secure Hash Algorithm，缩写为SHA</p>
<table>
<thead>
<tr>
<th>算法</th>
<th>输入</th>
<th>单次计算块</th>
<th>输出</th>
</tr>
</thead>
<tbody>
<tr>
<td>SHA1</td>
<td>0 ~ (2^64 - 1)字节，包括空数据</td>
<td>512比特（64字节）</td>
<td>160比特（20字节）</td>
</tr>
<tr>
<td>SHA224</td>
<td>0 ~ (2^64 - 1)字节，包括空数据</td>
<td>512比特（64字节）</td>
<td>224比特（28字节）</td>
</tr>
<tr>
<td>SHA256</td>
<td>0 ~ (2^64 - 1)字节，包括空数据</td>
<td>512比特（64字节）</td>
<td>256比特（32字节）</td>
</tr>
<tr>
<td>SHA384</td>
<td>0 ~ (2^128 - 1)字节，包括空数据</td>
<td>1024比特（128字节）</td>
<td>284比特（48字节）</td>
</tr>
<tr>
<td>SHA512</td>
<td>0 ~ (2^128 - 1)字节，包括空数据</td>
<td>1024比特（128字节）</td>
<td>512比特（64字节）</td>
</tr>
</tbody>
</table>
<p>SHA224、SHA256、SHA384、SHA512统称为SHA2。当前，SHA1已经被证明不安全了（Google曾公布过两幅不同的有意义的图片，但其SHA1值是一样的，这在法律上是极其可怕的事）。<br />
SHA2在安全领域仍然继续服役着。</p>
<p>SHA系列的最新标准已经有了SHA3系列，详情可以参考维基百科<a href="https://zh.wikipedia.org/wiki/SHA-3" title="SHA3">SHA3</a></p>
<h2>SM3</h2>
<blockquote>
<p>我国SM3密码算法正式成为ISO/IEC国际标准</p>
</blockquote>
<p>SM3是中华人民共和国政府采用的一种密码散列函数标准,相关标准为“GM/T 0004-2012 《SM3密码杂凑算法》”。<br />
在商用密码体系中，SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等，其算法公开。据国家密码管理局表示，其安全性及效率与SHA256相当。<br />
SM3 算法的哈希值大小为 256 比特。</p>
<table>
<thead>
<tr>
<th>算法</th>
<th>输入</th>
<th>单次计算块</th>
<th>输出</th>
</tr>
</thead>
<tbody>
<tr>
<td>SM3</td>
<td>0 ~ (2^64 - 1)字节，包括空数据</td>
<td>512比特（64字节）</td>
<td>256比特（16字节）</td>
</tr>
</tbody>
</table>
<h1>对称加密</h1>
<p>对称加密(Symmetry Crypto)，采用单钥密码系统的加密方法，加密和解密所使用的密钥是同一个。例如DES、3DES、AES、SM4等。</p>
<blockquote>
<p>Chacha20,流式加密的算法，也属于对称加密；Google发布并用于取代RC4算法。本文不涉及，详细可自行搜索。</p>
</blockquote>
<p>其安全性不仅取决于加密算法本身，密钥管理的安全性更是重要。<br />
通常对称加密的速度较快，在加密大量数据的场景，对称加密是首选。</p>
<h2>AES</h2>
<p>高级加密标准（英语：Advanced Encryption Standard，缩写：AES），是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES，已经被多方分析且广为全世界所使用。<br />
AES的区块长度固定为128 比特，密钥长度则可以是128，192或256比特;需要注意，AES中初始化向量(IV)的长度固定为128比特</p>
<table>
<thead>
<tr>
<th>算法</th>
<th>输入</th>
<th>单次计算块</th>
<th>KEY长度</th>
<th>IV长度</th>
<th>输出</th>
</tr>
</thead>
<tbody>
<tr>
<td>AES128</td>
<td>任意，包括空数据</td>
<td>128比特（16字节）</td>
<td>128比特（16字节）</td>
<td>128比特（16字节）</td>
<td>最大长度 = 输入长度+128比特）</td>
</tr>
<tr>
<td>AES192</td>
<td>任意，包括空数据</td>
<td>128比特（16字节）</td>
<td>192比特（24字节）</td>
<td>128比特（16字节）</td>
<td>最大长度 = 输入长度+128比特</td>
</tr>
<tr>
<td>AES256</td>
<td>任意，包括空数据</td>
<td>128比特（16字节）</td>
<td>256比特（32字节）</td>
<td>128比特（16字节）</td>
<td>最大长度 = 输入长度+128比特</td>
</tr>
</tbody>
</table>
<h2>AES加密几个要点</h2>
<p>摘自https://139.155.43.7/2019/11/21/ssl-evp%e6%a1%86%e6%9e%b6%ef%bc%9aaes%e5%8a%a0%e5%af%86/</p>
<ul>
<li>
<p>对称加密(Symmetry Crypto)<br />
加密和解密的钥匙是同一把----加密方和解密方拥有相同的密钥（音yue，四声）。</p>
</li>
<li>
<p>密钥(key)<br />
任意数据（不一定非得字符串），长度常见为128比特、192比特、256比特，也有支持512比特的算法库</p>
</li>
<li>
<p>初始化向量(IV)<br />
这不是AES算法标准强制要求的，是一种增加AES破解难度的手段。IV和密钥共同参与加密和解密运算。IV长度固定为128比特。</p>
</li>
<li>
<p>加密块(block)<br />
每次加密的块长度都是128比特；输入和输出长度相同，考虑补全模式的情况下，输出的最大长度 = 输入长度+128比特</p>
</li>
<li>
<p>加密模式<br />
是指当需要加密的源数据长度大于128比特时，加密块和加密块之间的运算模式。<br />
常见的有 CBC密码分组链接模式、ECB电码本模式（不推荐）、CTR计算器模式、CFB密码反馈模式、OFB输出反馈模式。</p>
</li>
<li>
<p>补全模式模式（padding）<br />
因为AES一个加密块为16字节，当源数据的最后一个块不足16字节时，需要手动补全为16字节。</p>
</li>
</ul>
<p>一般使用PKCS7模式，手动补全N个N，N为不足的字节数。</p>
<h2>SM4</h2>
<p>SM4（原名SMS4）是中华人民共和国政府采用的一种分组密码标准,其设计安全性等同于AES-128，但是近年来的一些密码分析表明的其全性略弱于AES-128.<br />
在商用密码体系中，SM4主要用于数据加密，其算法公开，分组长度与密钥长度均为128bit，</p>
<h1>非对称加密</h1>
<p>非对称加密，是指加密和解密的密钥不是同一个，是一对密钥--密钥对，分为公钥和私钥。非对称加密算法也称&quot;公钥加密算法&quot;</p>
<p>公钥（publickey），是公开的；私钥（privatekey），只被通信的一方持有，保密的。如果用公钥对数据进行加密，只有用对应的私钥才能解密。</p>
<p>和对称加密比起来，非对称加密通常速度较慢，但安全强度很高。所以，非对称加密一般用来传输或保密对称密钥。</p>
<p>当前比较流行的两种算法是</p>
<ul>
<li>基于极大整数做因数分解，以RSA为代表</li>
<li>ECC类，基于椭圆曲线数学，如SM2。</li>
</ul>
<p>通常，基于椭圆曲线的加密算法强度大于基于极大整数做因数分解的加密算法。</p>
<h2>RSA</h2>
<p>RSA加密算法是一种非对称加密算法. 对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之，对一极大整数做因数分解愈困难，RSA算法愈可靠。假如有人找到一种快速因数分解的算法的话，那么用RSA加密的信息的可靠性就肯定会极度下降。</p>
<p>另外，RSA也是一种分块加密算法。</p>
<table>
<thead>
<tr>
<th>算法</th>
<th>输入</th>
<th>单次计算块</th>
<th>输出</th>
</tr>
</thead>
<tbody>
<tr>
<td>RSA</td>
<td>任意数据</td>
<td>待加密的字节数不能超过密钥的比特长度值除以 8 再减去 11）</td>
<td>最大长度 = （输入长度 x 密钥长度）/( 密钥长度 - 11)</td>
</tr>
</tbody>
</table>
<h2>SM2</h2>
<blockquote>
<p>我国SM2密码算法正式成为ISO/IEC国际标准</p>
</blockquote>
<p>SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法，属于ECC算法的一种，其可靠性基于椭圆曲线数学（RSA基于极大整数做因数分解难题）。</p>
<p>SM2也是一种分块加密算法。</p>
<h2>SM9</h2>
<blockquote>
<p>我国SM9密码算法正式成为ISO/IEC国际标准</p>
</blockquote>
<p>有空再单开一篇文章介绍吧。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.z6z8.cn/2019/12/13/%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%b7%af%e6%80%bb%e7%bb%93%ef%bc%9a%e5%8a%a0%e5%af%86%e4%b8%8e%e8%a7%a3%e5%af%86%ef%bc%88%e4%b8%80%ef%bc%89/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>编程之路总结：编码与字符集</title>
		<link>https://blog.z6z8.cn/2019/12/04/%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%b7%af%e6%80%bb%e7%bb%93%ef%bc%9a%e7%bc%96%e7%a0%81%e4%b8%8e%e5%ad%97%e7%ac%a6%e9%9b%86/</link>
					<comments>https://blog.z6z8.cn/2019/12/04/%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%b7%af%e6%80%bb%e7%bb%93%ef%bc%9a%e7%bc%96%e7%a0%81%e4%b8%8e%e5%ad%97%e7%ac%a6%e9%9b%86/#respond</comments>
		
		<dc:creator><![CDATA[holdsky]]></dc:creator>
		<pubDate>Wed, 04 Dec 2019 03:16:42 +0000</pubDate>
				<category><![CDATA[编程之路总结]]></category>
		<guid isPermaLink="false">http://blog.z6z8.cn/?p=603</guid>

					<description><![CDATA[我曾经以为理所当然应该知道的事，而如今的一些程序员却一脸茫然。 先声明，我本人对Java没有偏见。 起因是这样 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>我曾经以为理所当然应该知道的事，而如今的一些程序员却一脸茫然。</p>
<p>先声明，我本人对Java没有偏见。</p>
<p>起因是这样的，同事拿着一段Java代码给我看，咨询下啥啥功能的事。我便细细观摩，看到关于读写文件的代码--将文件以字符串形式读到内存中。</p>
<p>看了会儿，我说：“这块有点瑕疵，没有指定文本的编码格式”<br />
他说：“什么编码？以前也这么写的，运行起来没有问题。”<br />
......（后续交流省略）.....</p>
<p>从我近年来和多位从事移动开发的程序员接触来看，我的感触就是移动互联网发展太快了，以至于他们完美的错过了这个行业很基础的知识灌溉----或者忙着写业务了，或者手中正翻看xx天速成、包教包会的书，或者忙着追各种吹牛x的黑科技了，</p>
<p>好了，抱怨了一通，我转回正题。为什么要指定文本的编码格式？这事儿要从上世纪的蛮荒时代说起。</p>
<h1>百花齐放</h1>
<p>我们都知道，计算机的中储存以字节（8比特）为单位，人们阅读的文本在计算机存储都是一堆字节，而不是什么“世界你好，hello world”之类的可阅读文本。</p>
<p>为了解码这些字节，必须按照一定的规范将文本映射为计算机可以储存的字节。最早的可知晓的规范就是非常著名的ASCII编码，比如 0x30 代表字符<code>0</code>, 0x41 代表字符<code>A</code>等等</p>
<p>ASCII编码，全称为美国信息交换标准代码， 在1967年作为规范标准发布，主要用来表示现代英文的编码约定（可以理解，那时计算机的主导是美国，到现在美国也是引领者），只定义了128个字符。</p>
<p>随着计算机的发展，越来越多的国家和地区使用计算机，自然因为语言不同，也有了制定适合自己国家和地区的文本编码了，诸如ISO系列，ibm系列，Windows系列，像中文的big-5,gb系列等，<a href="https://blog.csdn.net/miqi770/article/details/43935273" title="详细请参考">详细请参考</a></p>
<p>这里，闲聊一句，上世纪80、90年代BP寻呼机，支持汉显和不支持汉显的价格有时能差一倍。</p>
<p>当编码多了，最大的问题是不同编码之间无法相互兼容，只有程序员能明白这其中的苦楚；若还是不明白，问问微软在上世纪是如何在各个国家和地区适配多语言的。</p>
<h1>Unicode一统</h1>
<p>文本编码不能相互兼容，这为软件行业的发展、互联网的推广带来了很大的麻烦，统一字符编码势在必行。最终统一的结果也就是今天大家看到的Unicode---<code>是由一个名为 Unicode 学术学会(Unicode Consortium)的机构制订的字符编码系统，支持现今世界各种不同语言的书面文本的交换、处理及显示。该编码于1990年开始研发，1994年正式公布，最新版本是2019年5月7日的Unicode 12.1.0</code>(这段摘自百度百科)。</p>
<h2>字符集和编码</h2>
<p>这里单独说下字符集和编码的关系。<br />
平时我们交流时，很少说字符集，通常都是Unicode编码、GB2312编码，UTF8之类的。</p>
<p>严谨的来说，包括Unicode、ASCII、GB2312在内的编码规范，其实分为两部分：字符集、编码方式。</p>
<p>字符集，指的是该规范收录了哪些字符，可以称之为字符的集合。例如，ASCII收录了数字、大小写英文字母、一些常用的符号和一些控制打印的字符；GBK2312收录包括ASCII在内的符号，以及常用的汉字和符号，还收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。</p>
<p>编码方式，指将收录的字符如何映射到计算机中的字节存储。简单来说，ASCII是单字节编码，为每一个收录的字符分配一个字节的数值表示，比如 0x30 代表字符<code>0</code>, 0x41 代表字符<code>A</code>。</p>
<p>GBK2312是双字节编码，为每一个收录的字符分配两个字节的数值表示。</p>
<p>UTF8，是Unicode字符集的一种编码方式，变长字节；<br />
UTF16，是Unicode字符集的一种编码方式，两个字节（不考虑Java中的字符代理对情况）；另外，考虑到网络传输，UTF16还要区分大小端（大小尾）。两个数字 0xFFFE，0xFEFF，估计还是有人能看懂的。<br />
UTF32，是Unicode字符集的一种编码方式，四个字节；<br />
UTF7，有谁听说过吗？是Unicode字符集的一种编码方式，变长字节。</p>
<blockquote>
<p>另外，强烈建议在大部分场景使用UTF8编码方式，这是真正的万国编码。</p>
</blockquote>
<h1>为什么要指定文本编码</h1>
<p>答：因为鬼知道我不指定编码，软件会怎么解码文本？</p>
<h1>联通为什么干不过移动</h1>
<p>答：微软记事本告诉你https://www.iteye.com/blog/mfkvfn-1703414</p>
<pre><code>在windows操作系统中，新建一个文本文件，用词本打开，输入"联通"两个字之后，保存，关闭，然后再次打开，你会发现这两个字已经消失了，代之的是个乱码！而输入移去就不会有问题。

　　据说这就是联通之所以拼不过移动的原因。

　　Windows NT（Windows 2000及以上）版本的记事本 ，亦默认安装于Windows 2000和Windows XP中，可以侦查到缺乏字节序标记的Unicode文件。这个功能由一个Windows API提供，名为IsTextUnicode() 。但是，这个功能是不完美的，副作用是一些小写字体的ASCII文字，会错误判断为UTF-16。

　　在2006年5月18日，有报道称，对于一个含有类似"this app can break"这样短语的文档（甚至是类似"aaaa aaa aaa aaaaa"的简单短语），记事本会将其打开并显示为Unicode二进制文本。如果安装了相关中文字体则会显示二进制码所对应的汉字。造成这个错误的字符串可能形如“4个字母+空格+3个字母+空格+3个字母+空格+5个字母 ”，或者“4个字母+空格+5个字母+空格+5个字母+空格+5个字母 ”，并且文档末尾没有换行符。有人认为这是一个复活节彩蛋 ，但事实并非如此。还有人认为这是由于记事本的Unicode的检测算法所引起。

　　这个问题已在Windows Vista版本的Notepad中被修复。

　　但是，记事本还有一个问题，就是用ANSI保存的文档有时会被误认为Unicode。如在记事本中输入“联通 ”并保存，再次打开的时候会显示乱码，目前尚未被修复。</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.z6z8.cn/2019/12/04/%e7%bc%96%e7%a8%8b%e4%b9%8b%e8%b7%af%e6%80%bb%e7%bb%93%ef%bc%9a%e7%bc%96%e7%a0%81%e4%b8%8e%e5%ad%97%e7%ac%a6%e9%9b%86/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
