- 浏览: 234952 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
测试过程中遇到字符集问题小结
<p>作者:赵璨</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style=""><span style=""></span></span><span style="">这两天我们在用</span><span style="" lang="EN-US">dbunit</span><span style="">插</span><span style="" lang="EN-US">IM</span><span style="">数据库时碰到了乱码问题,初步做了研究,分享一下,可能对其他测试同学也会有点帮助。有错误的地方大家尽管指出。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="" lang="EN-US"><span style="font-size: small;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="">一:理论</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="" lang="EN-US"> </span><span style="">编程过程中涉及到的字符集编码问题通常涉及到这样几个因素:</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">1.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="">文件编码格式</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">例如</span><span style="" lang="EN-US">XML</span><span style="">文件通过第一行的声明指定了文件的编码格式。</span><span style="" lang="EN-US">Java</span><span style="">中可以通过</span><span style="" lang="EN-US">InputStream</span><span style="">读取文件,用</span><span style="" lang="EN-US">InputStreamReader</span><span style="">来对读取后的字节解码。这些在陈教兽的</span><span style="" lang="EN-US">blog</span><span style="">中也有(</span><span style="color: #9d9d9d;" lang="EN-US"><a title="阿里旺旺无法确定该链接的安全性" href="http://blog.csdn.net/linkyou/archive/2009/03/14/3990547.aspx" target="_blank"><span style="color: gray;"><span style="font-family: Times New Roman;">http://blog.csdn.net/linkyou/archive/2009/03/14/3990547.aspx</span></span></a></span><span style="">),例如:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="color: black;" lang="EN-US"><span style="font-size: small;"><span style="font-family: Times New Roman;">InputStream is = new FileInputStream("z.xml"); <br>InputStreamReader streamReader = new InputStreamReader(is, "GBK");</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">当然也有用其他方式解码的,例如</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">Dom4j</span></span><span style="">等等。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">2.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="" lang="EN-US">JVM</span><span style="">编码格式</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">默认的</span><span style="" lang="EN-US">Java</span><span style="">都是使用</span><span style="" lang="EN-US">Unicode</span><span style="">字符集已做到更好的国际化。因此当需要解析其他字符集的时候,我们需要进行相应的解码。例如:</span></span></p>
<p>
</p>
<table class="MsoNormalTable" style="border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0"><tbody><tr style="">
<td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 426.1pt; padding-top: 0cm; background-color: transparent;" width="568" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> String <span style="background: silver;">s</span> = </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"abc"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> </span><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">byte</span></strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">[] b = <span style="background: silver;">s</span>.getBytes(</span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"UTF-8"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">);</span></p>
</td>
</tr></tbody></table>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="" lang="EN-US"><span style="font-size: small;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">又或者有另一种方式:</span></span></p>
<p>
</p>
<table class="MsoNormalTable" style="border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0"><tbody><tr style="">
<td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 426.1pt; padding-top: 0cm; background-color: transparent;" width="568" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">String sql = </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"abc";</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">String s2 = </span><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">new</span></strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> String(sql.getBytes(</span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"GBK"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">), </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"ISO8859-1"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">);</span></p>
</td>
</tr></tbody></table>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">这个如何解释?不能直接理解为将</span><span style="" lang="EN-US">GBK</span><span style="">转为</span><span style="" lang="EN-US">ISO8859-1</span><span style="">。而是应该理解为字符串</span><span style="" lang="EN-US">sql</span><span style="">用</span><span style="" lang="EN-US">GBK</span><span style="">解码还原为原始字节数组,再用</span><span style="" lang="EN-US">ISO8859-1</span><span style="">解码成正确的字符串。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="" lang="EN-US"><span style="font-size: small;"></span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">3.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="">数据库编码格式</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">这个又复杂了一点,就谈</span><span style="" lang="EN-US">Oracle</span><span style="">的字符集,分成服务端和客户端。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">服务端上,</span><span style="" lang="EN-US">us7ascii</span><span style="">是</span><span style="" lang="EN-US">Oracle</span><span style="">最早支持的编码方案,是单字节编码的。现在为了支持国际化,一般都采用</span><span style="" lang="EN-US">unicode</span><span style="">编码了。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">客户端上,是通过</span><span style="" lang="EN-US">NLS_LANG</span><span style="">指定编码方式的,任何发自或发往客户端的数据都是用客户端定义的字符集编码。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="" lang="EN-US"><span style="font-size: small;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="">二:实战</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="" lang="EN-US"> </span><span style="">好,现在回到我们的问题:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="" lang="EN-US">1. </span><span style="">为什么数据库编码为</span><span style="" lang="EN-US">us7ascii</span><span style="">时,我们用</span><span style="" lang="EN-US">dbunit</span><span style="">插数据会出现乱码?</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="">因为:</span><span style="" lang="EN-US">1. </span><span style="">我们的</span><span style="" lang="EN-US">xml</span><span style="">数据文件编码是</span><span style="" lang="EN-US">UTF-8</span><span style="">:</span><span style="" lang="EN-US"> <?xml version="1.0" encoding="UTF-8"?></span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">2.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="" lang="EN-US">JVM</span><span style="">编码默认是</span><span style="" lang="EN-US">GBK</span><span style="">,可能大家不同的系统会略有区别,不过应该都是</span><span style="" lang="EN-US">Unicode</span><span style="">双字节编码:可以通过</span><span style="" lang="EN-US">Charset.defaultCharset()</span><span style="">查看默认编码</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">3.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="" lang="EN-US">IM</span><span style="">数据库服务端编码是</span><span style="" lang="EN-US">us7ascii</span><span style="">,客户端也要用</span><span style="" lang="EN-US">us7ascii</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 25.5pt;"><span style="font-size: small;"><span style="">首先</span><span style="" lang="EN-US">dbunit</span><span style="">读取</span><span style="" lang="EN-US">utf-8</span><span style="">的文件,默认情况下却用双字节的</span><span style="" lang="EN-US">gbk</span><span style="">解码,然后插入到单字节编码规范的数据库中,肯定出现乱码。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">2.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="">如何解决?</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-size: small;"><span style="">最好是编码格式统一,当然数据库的编码格式我们不能改。我们能够改的是</span><span style="" lang="EN-US">xml</span><span style="">文件:</span><span style="" lang="EN-US"> <?xml version="1.0" encoding="GBK"?></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-size: small;"><span style="" lang="EN-US">Ok</span><span style="">,现在前两步统一编码了,现在要做的是在插入数据库之前在</span><span style="" lang="EN-US">java</span><span style="">代码中用对应</span><span style="" lang="EN-US">us7ascii</span><span style="">的编码格式做一次解码,对应的编码规范是“</span><span style="" lang="EN-US">ISO8859-1<span style="" lang="EN-US"><span lang="EN-US">”</span></span></span><span style="">。这里我们</span><span style="" lang="EN-US">Dbunit</span><span style="">的代码要做一下改进,陈洪看看,更新一下代码。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-size: small;"><span style="">具体代码如下:</span></span></p>
<p>
</p>
<table class="MsoNormalTable" style="border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0"><tbody><tr style="">
<td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 426.1pt; padding-top: 0cm; background-color: transparent;" width="568" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> DbUnit db = </span><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">new</span></strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> DbUnit(</span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"oracle.jdbc.driver.OracleDriver"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">,</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"jdbc:oracle:thin:@10.2.225.81:1521:asoft"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">, </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"aliim"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">,</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"aliim"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> db.setSchema(</span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"ALIIM"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> String path = </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"util//z.xml"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> FileInputStream stream = </span><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">new</span></strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> FileInputStream(path);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> //</span></strong><strong><span style="">用</span></strong><strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">InputStreamReader</span></strong><strong><span style="">的构造函数对读取的字节流做</span></strong><strong><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">ISO8859-1</span></strong><strong><span style="">的解码</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> InputStreamReader reader = </span></strong><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">new</span></strong><strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> InputStreamReader(stream, </span></strong><strong><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"ISO8859-1"</span></strong><strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">);</span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; font-family: "Courier New";' lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> FlatXmlDataSet dataSet = </span><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">new</span></strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> FlatXmlDataSet(reader);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> DatabaseOperation.</span><em><span style='font-size: 10pt; color: #0000c0; font-family: "Courier New";' lang="EN-US">INSERT</span></em><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">.execute(db.getConnection(), dataSet);</span></p>
</td>
</tr></tbody></table>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style=""><span style=""></span></span><span style="">这两天我们在用</span><span style="" lang="EN-US">dbunit</span><span style="">插</span><span style="" lang="EN-US">IM</span><span style="">数据库时碰到了乱码问题,初步做了研究,分享一下,可能对其他测试同学也会有点帮助。有错误的地方大家尽管指出。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="" lang="EN-US"><span style="font-size: small;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="">一:理论</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="" lang="EN-US"> </span><span style="">编程过程中涉及到的字符集编码问题通常涉及到这样几个因素:</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">1.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="">文件编码格式</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">例如</span><span style="" lang="EN-US">XML</span><span style="">文件通过第一行的声明指定了文件的编码格式。</span><span style="" lang="EN-US">Java</span><span style="">中可以通过</span><span style="" lang="EN-US">InputStream</span><span style="">读取文件,用</span><span style="" lang="EN-US">InputStreamReader</span><span style="">来对读取后的字节解码。这些在陈教兽的</span><span style="" lang="EN-US">blog</span><span style="">中也有(</span><span style="color: #9d9d9d;" lang="EN-US"><a title="阿里旺旺无法确定该链接的安全性" href="http://blog.csdn.net/linkyou/archive/2009/03/14/3990547.aspx" target="_blank"><span style="color: gray;"><span style="font-family: Times New Roman;">http://blog.csdn.net/linkyou/archive/2009/03/14/3990547.aspx</span></span></a></span><span style="">),例如:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="color: black;" lang="EN-US"><span style="font-size: small;"><span style="font-family: Times New Roman;">InputStream is = new FileInputStream("z.xml"); <br>InputStreamReader streamReader = new InputStreamReader(is, "GBK");</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">当然也有用其他方式解码的,例如</span><span style="color: black;" lang="EN-US"><span style="font-family: Times New Roman;">Dom4j</span></span><span style="">等等。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">2.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="" lang="EN-US">JVM</span><span style="">编码格式</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">默认的</span><span style="" lang="EN-US">Java</span><span style="">都是使用</span><span style="" lang="EN-US">Unicode</span><span style="">字符集已做到更好的国际化。因此当需要解析其他字符集的时候,我们需要进行相应的解码。例如:</span></span></p>
<p>
</p>
<table class="MsoNormalTable" style="border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0"><tbody><tr style="">
<td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 426.1pt; padding-top: 0cm; background-color: transparent;" width="568" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> String <span style="background: silver;">s</span> = </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"abc"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> </span><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">byte</span></strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">[] b = <span style="background: silver;">s</span>.getBytes(</span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"UTF-8"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">);</span></p>
</td>
</tr></tbody></table>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="" lang="EN-US"><span style="font-size: small;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">又或者有另一种方式:</span></span></p>
<p>
</p>
<table class="MsoNormalTable" style="border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0"><tbody><tr style="">
<td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 426.1pt; padding-top: 0cm; background-color: transparent;" width="568" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">String sql = </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"abc";</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">String s2 = </span><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">new</span></strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> String(sql.getBytes(</span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"GBK"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">), </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"ISO8859-1"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">);</span></p>
</td>
</tr></tbody></table>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">这个如何解释?不能直接理解为将</span><span style="" lang="EN-US">GBK</span><span style="">转为</span><span style="" lang="EN-US">ISO8859-1</span><span style="">。而是应该理解为字符串</span><span style="" lang="EN-US">sql</span><span style="">用</span><span style="" lang="EN-US">GBK</span><span style="">解码还原为原始字节数组,再用</span><span style="" lang="EN-US">ISO8859-1</span><span style="">解码成正确的字符串。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="" lang="EN-US"><span style="font-size: small;"></span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">3.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="">数据库编码格式</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">这个又复杂了一点,就谈</span><span style="" lang="EN-US">Oracle</span><span style="">的字符集,分成服务端和客户端。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">服务端上,</span><span style="" lang="EN-US">us7ascii</span><span style="">是</span><span style="" lang="EN-US">Oracle</span><span style="">最早支持的编码方案,是单字节编码的。现在为了支持国际化,一般都采用</span><span style="" lang="EN-US">unicode</span><span style="">编码了。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 42pt;"><span style="font-size: small;"><span style="">客户端上,是通过</span><span style="" lang="EN-US">NLS_LANG</span><span style="">指定编码方式的,任何发自或发往客户端的数据都是用客户端定义的字符集编码。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="" lang="EN-US"><span style="font-size: small;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><strong><span style="">二:实战</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="" lang="EN-US"> </span><span style="">好,现在回到我们的问题:</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="" lang="EN-US">1. </span><span style="">为什么数据库编码为</span><span style="" lang="EN-US">us7ascii</span><span style="">时,我们用</span><span style="" lang="EN-US">dbunit</span><span style="">插数据会出现乱码?</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="">因为:</span><span style="" lang="EN-US">1. </span><span style="">我们的</span><span style="" lang="EN-US">xml</span><span style="">数据文件编码是</span><span style="" lang="EN-US">UTF-8</span><span style="">:</span><span style="" lang="EN-US"> <?xml version="1.0" encoding="UTF-8"?></span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">2.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="" lang="EN-US">JVM</span><span style="">编码默认是</span><span style="" lang="EN-US">GBK</span><span style="">,可能大家不同的系统会略有区别,不过应该都是</span><span style="" lang="EN-US">Unicode</span><span style="">双字节编码:可以通过</span><span style="" lang="EN-US">Charset.defaultCharset()</span><span style="">查看默认编码</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">3.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="" lang="EN-US">IM</span><span style="">数据库服务端编码是</span><span style="" lang="EN-US">us7ascii</span><span style="">,客户端也要用</span><span style="" lang="EN-US">us7ascii</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 25.5pt;"><span style="font-size: small;"><span style="">首先</span><span style="" lang="EN-US">dbunit</span><span style="">读取</span><span style="" lang="EN-US">utf-8</span><span style="">的文件,默认情况下却用双字节的</span><span style="" lang="EN-US">gbk</span><span style="">解码,然后插入到单字节编码规范的数据库中,肯定出现乱码。</span></span></p>
<p class="MsoNormal" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small;">2.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span style="">如何解决?</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-size: small;"><span style="">最好是编码格式统一,当然数据库的编码格式我们不能改。我们能够改的是</span><span style="" lang="EN-US">xml</span><span style="">文件:</span><span style="" lang="EN-US"> <?xml version="1.0" encoding="GBK"?></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-size: small;"><span style="" lang="EN-US">Ok</span><span style="">,现在前两步统一编码了,现在要做的是在插入数据库之前在</span><span style="" lang="EN-US">java</span><span style="">代码中用对应</span><span style="" lang="EN-US">us7ascii</span><span style="">的编码格式做一次解码,对应的编码规范是“</span><span style="" lang="EN-US">ISO8859-1<span style="" lang="EN-US"><span lang="EN-US">”</span></span></span><span style="">。这里我们</span><span style="" lang="EN-US">Dbunit</span><span style="">的代码要做一下改进,陈洪看看,更新一下代码。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt;"><span style="font-size: small;"><span style="">具体代码如下:</span></span></p>
<p>
</p>
<table class="MsoNormalTable" style="border-collapse: collapse;" border="0" cellspacing="0" cellpadding="0"><tbody><tr style="">
<td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 426.1pt; padding-top: 0cm; background-color: transparent;" width="568" valign="top">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> DbUnit db = </span><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">new</span></strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> DbUnit(</span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"oracle.jdbc.driver.OracleDriver"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">,</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"jdbc:oracle:thin:@10.2.225.81:1521:asoft"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">, </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"aliim"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">,</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"aliim"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> db.setSchema(</span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"ALIIM"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> String path = </span><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"util//z.xml"</span><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">;</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> FileInputStream stream = </span><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">new</span></strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> FileInputStream(path);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> //</span></strong><strong><span style="">用</span></strong><strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">InputStreamReader</span></strong><strong><span style="">的构造函数对读取的字节流做</span></strong><strong><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">ISO8859-1</span></strong><strong><span style="">的解码</span></strong><strong></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> InputStreamReader reader = </span></strong><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">new</span></strong><strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> InputStreamReader(stream, </span></strong><strong><span style='font-size: 10pt; color: #2a00ff; font-family: "Courier New";' lang="EN-US">"ISO8859-1"</span></strong><strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">);</span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; font-family: "Courier New";' lang="EN-US"></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> FlatXmlDataSet dataSet = </span><strong><span style='font-size: 10pt; color: #7f0055; font-family: "Courier New";' lang="EN-US">new</span></strong><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> FlatXmlDataSet(reader);</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US"> DatabaseOperation.</span><em><span style='font-size: 10pt; color: #0000c0; font-family: "Courier New";' lang="EN-US">INSERT</span></em><span style='font-size: 10pt; color: black; font-family: "Courier New";' lang="EN-US">.execute(db.getConnection(), dataSet);</span></p>
</td>
</tr></tbody></table>
相关推荐
### 乱码解决,简单小结 在Java开发过程中,我们经常会遇到乱码的问题,尤其是在前端与后端数据交互的过程中。本文将针对Java中的乱码问题进行总结,并提供几种简单的解决方案。 #### 一、理解字符编码与乱码产生...
3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...
3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...
MySQL数据库在从较低版本升级到8.0时,会遇到一系列与兼容性、安全性相关的注意事项...迁移过程中,务必充分测试,避免在生产环境中出现不可预见的问题。对于大型数据库,建议在非生产环境中先行演练,以确保平稳过渡。
【计算机软件及应用软件故障模型】是软件测试领域的一个重要概念,主要关注的是在软件运行过程中可能出现的问题和故障。故障模型旨在模拟和预测软件在不同输入条件下的行为,以识别潜在的缺陷。测试人员通常利用这些...
- 输入处理:程序应能处理各种字符集,并统计字符频率。 - 哈夫曼树构造:根据字符频率构建最优的哈夫曼树,树的每个叶子节点代表一个字符,内部节点无值。 - 编码生成:从哈夫曼树生成字符的二进制编码,编码长度随...
2. **运行错误**:运行错误在代码执行过程中发生,例如尝试访问不存在的数组元素或超出变量范围。对于这类错误,可以使用`On Error Resume Next`或`On Error GoTo 0`来实现错误处理,确保程序即使遇到错误也能继续...
实验小结则包含了对实验结果的分析、遇到的问题、解决方法以及实验的收获。在这个环节中,学生会反思实验过程中出现的问题,比如本实验报告中提到的因为没有看清线路导致的错误,并提出改进方法。例如,报告作者表示...
1.10 小结 18 1.11 习题 18 第2章 编程初步 19 2.1 计算机的内存 19 2.2 什么是变量 21 2.3 存储数值的变量 21 2.3.1 整数变量 21 2.3.2 变量的命名 25 2.3.3 变量的使用 26 2.3.4 变量的初始化 28 2.3.5 ...
- `[] (方括号)`:定义一个字符集。 - `^ (脱字符)`:在字符集中,表示“不包括”的意思;在表达式开始处,表示字符串的起始位置。 - `$ (美元符号)`:表示字符串的结束位置。 - `\b (单词边界)`:匹配一个单词...
1.8 本章小结 24 1.9 练习 25 第2章 站点设计 27 2.1 总体设计目标 27 2.2 Master和Content页面 28 2.2.1 创建Master页面 29 2.2.2 创建Content页面 31 2.2.3 Master和Content页面的示例 32 2.2.4 在Master...
本书既考虑到实际开发中经常遇到的困惑和难题,也分析了解决问题的思路和方法,更总结出项目开发中不可或缺的技术点及思想。读者可以在欣赏一个个有趣例子的过程中,不知不觉具备开发真正商业项目的能力。 本书集...
本书既考虑到实际开发中经常遇到的困惑和难题,也分析了解决问题的思路和方法,更总结出项目开发中不可或缺的技术点及思想。读者可以在欣赏一个个有趣例子的过程中,不知不觉具备开发真正商业项目的能力。 本书集...
14.4 继承中关于属性的一些问题.169 14.5 小 结 .172 第四部分 深入了解 C#.174 第十五章 接 口 .174 15.1 组件编程技术 .174 15.2 接 口 定 义 .177 15.3 接口的成员 .178 15.4 接口的实现 .182 ...
**1.7 小结** 本文详细介绍了Selenium自动化测试的基础知识,包括Selenium的简介、Python环境安装、Selenium的安装与验证、浏览器驱动配置以及PyCharm的使用。通过这些步骤,读者可以快速搭建起Selenium自动化测试...
尽管ASP相对简单易学,但开发者在编码过程中还是容易遇到各种错误。以下是关于ASP常见错误及其解决方案的知识点详解。 1. 编译错误 编译错误通常是由于代码语法问题引起的,这种错误会导致ASP停止运行。编译错误是...
但是可以使用 -sc<字符集>l 开关重定义。 你可以在同一命令行指定普通文件名和列表文件。如果文件和列表 文件都未被指定,那么 RAR 将默认是 *.*,来处理所有文件。 许多 RAR 命令,例如解压、测试和列表,都...
这个过程可能会遇到数据类型不匹配、字符集转换等问题,需要仔细处理以确保数据的准确性和完整性。 十六、Redis多实例重启脚本 Redis支持在同一台服务器上运行多个实例,但是管理和重启这些实例可能需要特定的脚...
### 小结 以上是对使用SQL Server 2005进行数据挖掘过程中可能遇到的关键步骤的概述。通过对这些步骤的理解,用户可以更好地利用该工具进行数据分析和预测。需要注意的是,虽然SQL Server 2005是一款非常强大的工具...