﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-爪哇财经-文章分类-j2se</title><link>http://www.blogjava.net/jade-liu/category/35451.html</link><description>java</description><language>zh-cn</language><lastBuildDate>Fri, 11 Sep 2009 08:09:29 GMT</lastBuildDate><pubDate>Fri, 11 Sep 2009 08:09:29 GMT</pubDate><ttl>60</ttl><item><title>native2ascii工具</title><link>http://www.blogjava.net/jade-liu/articles/293759.html</link><dc:creator>jade76</dc:creator><author>jade76</author><pubDate>Thu, 03 Sep 2009 09:05:00 GMT</pubDate><guid>http://www.blogjava.net/jade-liu/articles/293759.html</guid><wfw:comment>http://www.blogjava.net/jade-liu/comments/293759.html</wfw:comment><comments>http://www.blogjava.net/jade-liu/articles/293759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jade-liu/comments/commentRss/293759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jade-liu/services/trackbacks/293759.html</trackback:ping><description><![CDATA[<p align="center"><strong>JDK自带的native2ascii工具完全揭密</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;背景：在做Java开发的时候，常常会出现一些乱码，或者无法正确识别或读取的文件，比如常见的validator验证用的消息资源（properties）文件就需要进行Unicode重新编码。原因是java默认的编码方式为Unicode，而我们的计算机系统编码常常是GBK等编码。需要将系统的编码转换为java正确识别的编码问题就解决了。</p>
<p><strong>1、native2ascii简介：<br />
</strong>native2ascii是sun java <br />
sdk提供的一个工具。用来将别的文本类文件（比如*.txt,*.ini,*.properties,*.java等等）编码转为Unicode编码。为什么要进行转码，原因在于程序的国际化。Unicode编码的定义：Unicode（统一码、万国码、单一码）是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码，以满足跨语言、跨平台进行文本转换、处理的要求。1990年开始研发，1994年正式公布。随着计算机工作能力的增强，Unicode也在面世以来的十多年里得到普及。（声明：Unicode编码定义来自互联网）。</p>
<p><strong>2、获取native2ascii：</strong><br />
安装了jdk后，假如你是在windows上安装，那么在jdk的安装目录下，会有一个bin目录，其中native2ascii.exe正是。</p>
<p><strong>3、native2ascii的命令行的命名格式：</strong><br />
native2ascii -[options] [inputfile [outputfile]]</p>
<p>说明： <br />
-[options]：表示命令开关，有两个选项可供选择<br />
-reverse：将Unicode编码转为本地或者指定编码，不指定编码情况下，将转为本地编码。<br />
-encoding encoding_name：转换为指定编码，encoding_name为编码名称。<br />
[inputfile [outputfile]]<br />
inputfile：表示输入文件全名。<br />
outputfile：输出文件名。如果缺少此参数，将输出到控制台。<br />
<strong>4、最佳实践：</strong><br />
<br />
首先将JDK的bin目录加入系统变量path。在盘下建立一个test目录，在test目录里建立一个zh.txt文件，文件内容为：&#8220;熔岩&#8221;，打开&#8220;命令行提示符&#8221;，并进入C:\test目录下。下面就可以按照说明一步一步来操作，注意观察其中编码的变化。</p>
<p>A：将zh.txt转换为Unicode编码，输出文件到u.txt<br />
native2ascii zh.txt u.txt<br />
打开u.txt，内容为&#8220;\u7194\u5ca9&#8221;。<br />
B：将zh.txt转换为Unicode编码，输出到控制台<br />
C:\test&gt;native2ascii zh.txt<br />
\u7194\u5ca9<br />
可以看到，控制台输出了&#8220;\u7194\u5ca9&#8221;。<br />
C：将zh.txt转换为ISO8859-1编码，输出文件到i.txt<br />
native2ascii -encoding ISO8859-1 zh.txt i.txt<br />
打开i.txt文件，内容为&#8220;\u00c8\u00db\u00d1\u00d2&#8221;。<br />
D：将u.txt转换为本地编码，输出到文件u_nv.txt<br />
native2ascii -reverse u.txt u_nv.txt<br />
打开u_nv.txt文件，内容为&#8220;熔岩&#8221;。<br />
E：将u.txt转换为本地编码，输出到控制台<br />
C:\test&gt;native2ascii -reverse u.txt<br />
熔岩<br />
可以看到，控制台输出了&#8220;熔岩&#8221;。<br />
F：将i.txt转换为本地编码，输出到i_nv.txt<br />
native2ascii -reverse i.txt i_nv.txt<br />
打开i_nv.txt文件，内容为&#8220;\u00c8\u00db\u00d1\u00d2&#8221;。发现转码前后完全一样的。也就是说，等于没有转，或者说思想糊涂，对命名没有理解。。</p>
<p>G：将i.txt转换为GBK编码，输出到i_gbk.txt<br />
native2ascii -reverse -encoding GBK i.txt i_gbk.txt<br />
打开i_gbk.txt文件，内容为&#8220;\u00c8\u00db\u00d1\u00d2&#8221;。发现转码前后完全一样的。也就是说，等于没有转，或者说思想糊涂，对命名没有理解。</p>
<p>H：将u_nv.txt转码到本地编码GBK，输出到控制台<br />
C:\test&gt;native2ascii -reverse -encoding ISO8859-1 i.txt<br />
熔岩<br />
从这个结果看，目标达到到了，编码i.txt为ISO8859-1，转为本地编码后内容为&#8220;熔岩&#8221;。从这里应该意识到，native2ascii <br />
-reverse命令中-encoding指定的编码为源文件的编码格式。而在native2ascii <br />
命令中-encoding指定的编码为（生成的）目标文件的编码格式。这一点非常的重要！切记！！继续探索，新建文件12a.txt，内容&#8220;12axyz&#8221;。看看纯字母数字的编码又如何。</p>
<p>I：将纯字母数字的文本文件12a.txt转换为Unicode编码<br />
native2ascii 12a.txt 12a_nv.txt<br />
打开12a_nv.txt文件，内容为&#8220;12axyz&#8221;。<br />
继续测试，转为ISO8859-1编码看看<br />
C:\test&gt;native2ascii -encoding ISO8859-1 12a.txt<br />
12axyz<br />
结果还是没有转码。<br />
从结果可以得出结论：对于纯数字和字母的文本类型件，转码前后的内容是一样的。</p>
<p><strong>5、总结：</strong><br />
native2ascii是一个非常的好转码工具，并且转码是可逆的！而其真正的含义并非本地编码——&gt;转码为ASCII码，而是一个通用的文本文件编码转换工具。在做编码转换的时候有两类指定编码的情形，分别指输出文件编码和输入文件编码，具体可以看看最佳实践部分。<br />
实际应用中：<br />
比如可以这样利用native2ascii：<br />
native2ascii -encoding gbk&nbsp;&nbsp;&nbsp;&nbsp; temp.properties&nbsp;&nbsp;&nbsp; application_zh_CN.properties&nbsp;<br />
这里将根据一个临时文件temp.properties输出了application_zh_CN.properties，然后把application_zh_CN.properties中的文件内容替换这个临时文件的内容就可以了。</p>
<img src ="http://www.blogjava.net/jade-liu/aggbug/293759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jade-liu/" target="_blank">jade76</a> 2009-09-03 17:05 <a href="http://www.blogjava.net/jade-liu/articles/293759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>