最近遇到一个比较难的问题,我需要把一个文本文件里的数据读出来,这个文件是别人提供的。可是里面的内容却是这样的:
\ufffd\ufffd\ufffd\u0228^2005-06-28  10:02:53^200506280262^68144558^^^125^\ufffd\ufffd\ufffd\u07b0\ufffd\ufffd\ufffd
在这我说明一下,“\ufffd\ufffd\ufffd\u0228”其实是汗字,我查询了一些资料,有一段说让我茅塞顿开,原话为:
“举例说明。有GB2312中有一个汉字“李”,其编码为“C0EE”,欲转化为ISO8859-1编码。步骤为:先把“李”字转化为Unicode,得到“674E”,再把“674E”转化为ISO8859-1字符。当然,这个映射不会成功,因为ISO8859-1中根本就没有与“674E”对应的字符。
  当映射不成功时,问题就发生了!当从某语言向Unicode转化时,如果在某语言中没有该字符,得到的将是Unicode的代码“\uffffd”(“\u”表示是Unicode编码,)。而从Unicode向某语言转化时,如果某语言没有对应的字符,则得到的是“0x3f”(“?”)。这就是“?”的由来。
  例如:把字符流buf =“0x80 0x40 0xb0 0xa1”进行new String(buf, "gb2312")操作,得到的结果是“\ufffd\u554a”,再println出来,得到的结果将是“?啊”,因为“0x80 0x40”是GBK中的字符,在GB2312中没有。”
   于是我怀疑对方在给我文件的时候,汗字转换的编码都失败,所以在TXT文件里就都是\ufffd。
我想问的是,我怎么才能把实际存在于TXT文件里的这些\ufffd\ufffd\ufffd\u0228转换为汗字呢?我自己也想过,可能不行。因为现在得到的只是一些表现的字符串。要转换,应该得到原始的编码,请问能转换吗?如果能,改怎么转换。

解决方案 »

  1.   

    \ufffd\ufffd\ufffd
    这些字符可以通过JDK的bin中的native2ascii来得到。比如你可以这样一试
    native2ascii 1.txt 2.txt
    你的1.txt中的中文就会变成unicode编码
    如果你要取得这些字符以中文显示的话。
    直接取出就可以了。
      

  2.   

    谢谢nighthawk(我们孤单,我们并肩)回答。
    但现在的问题是:我得到的文件里的内容就是\ufffd\ufffd\ufffd的形势,我想要做的是:
    把\ufffd\ufffd\ufffd给转换为汉字,这样我好显示出来。而不是把汉字给转换为\ufffd的格式
      

  3.   

    可事情却不象我想象中的那样
    我写了一个例子
    1.txt中为aaa=天气真好
    通过native2ascii转码 2.txt内容变为了aaa=\u5929\u6c14\u771f\u597d
    再通过方法读入2.txt
    class Money{
    public static String getProperties(){
         Properties pro= new Properties();
         try{     
          InputStream inpStr= Class.forName("mytest.Money").getResourceAsStream("2.txt");     
          pro.load(inpStr);
         }
         catch(Exception e){
           e.printStackTrace();
         }
          return pro.getProperty("aaa");
       }
    public static void main(String args[]){
        System.out.println("ssssddddd"+ Money.getProperties());
       }
    }
    结果很正确。且以中文显示。但楼主给出的编码却是"?"
    只能得出结论:你问提供给你文件的本人好了。
      

  4.   

    \ufffd 跑出来的是问号。它不是以这种方式转的。具体的要问本人
      

  5.   

    在测试中我发现了一个问题,对方告诉我转换的编码为UTF8
    于是我试了一下:
    3.txt的内容是:a=我爱你
    当执行native2ascii -encoding utf8 3.txt 333.txt后333.txt的内容是a=\ufffd\u04b0\ufffd\ufffd\ufffd
    这个效果和我得到的文本文件的内容差不多,而且用楼上朋友的代码读出的内容都是?
      

  6.   

    这个说明了什么呢?说明是对方提供的编码有问题,怎么把UTF8又转换回来呢?
      

  7.   

    用new String(Money.getProperties().getBytes("UTF8"),"gbk");
    转码以后变成“锟揭帮拷锟斤拷” 呵呵。
      

  8.   

    “锟揭帮拷锟斤拷”,呵呵~!
    好奇怪啊,怎么转换成了UTF8后,好象编码就无法还原啦~!
    郁闷~
      

  9.   

    今天上网看见了一个好东东,分享给大家,相信的可以试试呀!这个东东叫cashspace,是个泡点换钱的软件,就是利用你的机器作为广告平台,为广告商作广告,广告商给我一定的费用。如果你不相信就不要往下看了!!!这个软件是在你上网的同时挂在上面就可以实现记点,到一定的点数就可以给你money了如果你想试一试,可以跟着我做:1.首先到http://www.cashspace.com/signup.asp?refID=gouldiae_yu这个网址注册一下用户
      因为注册是英文的,所以罗嗦一下,给不会填写的朋友一个帮助:
      进入上面的网址,在左侧有个login(注册),点击进入注册页面,现在让我们来注册吧
    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    × 第一部分是:填写基本数据,以便网站以后能将薪资支票寄送到你手上: ×
    × *Salutation(称呼):Mr.(先生)、Mrs.(太太)、Ms.(小姐) ×
    × *First Name(名) ×
    × *Last Name(姓): ×
    × *Mailing Address(收支票的地址):须用英文填写。 ×
    × *City (城市):从上面的邮寄地址提取,按乡,县,市顺序填入即可。 ×
    * State or Province (省、州或郡):台湾的朋友就打Taiwan。 ×
    * Postal Code (邮政编码):邮寄地址查询时候就会一起提供。 ×
    * Country (国家):这不用教吧! ×
    * E-mail Address(电子邮件地址) ×
    * Please confirm your e-mail address (请再输输入一遍你的电子邮件地址) ×
    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    这部分很重要呀,别把姓名填反了,地址要写清楚,尽量简写,因为他的地址输入有限制的,好像是40个字符
    给大家几个英文地址,仿照写一下吧!北京路45号,7栋201房,填Room 201,Building 7, 45 beijing Road。 
    广东省广州中山路3号, No.3,ZhongShan Road,Guangzhou,GuangDong; department the People’Republic of China 
    虹口区西康南路125弄34号201室 
    Room 201,No.34,Lane 125,XiKang Road(South),HongKou District 
    北京市崇文区天坛南里西区20楼3单元101 
    Room 3-101 building No.20,TianTan-NanXiLi Residential ChongWen District 
    BeiJing City 
    江苏省扬州市宝应县泰山东村102栋204室 
    Room 204 building No.102, East TaiShan Residential BaoYin County 
    JiangSu Province ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    × 第二部分是会员调查(Member Survey) ×    
    × 你可以自由填写,或是不予回答(No Comment): ×
    * Age(年龄) ×
    * Education(教育程度) ×
    * Employment(职业) ×
    * Yearly Salaries(年收入) ×
    * Marital status(婚姻状况) ×
    * Family members(家庭成员数目) ×
    * Computer location(计算机位置) ×
    * Have you ever made a purchase on-line?(是否曾网络购物?) ×
    * How many hours do you typically spend on the web in a month?(每个月上网时数?) ×
    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    这部分不是很重要就是给调查,如果不想填就都选no comment×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    × 第三部份是要选择自己的使用账号、密码及介绍人回馈方案, ×
    × 记住这部份的数据只要登录之后就无法再做变更,请审慎考虑再做决定: ×
    × *Select a referral system(选择介绍人回馈方案):这个部分非常、 ×
    × 非常重要,请耐心看过我的分析再做决定! ×
    × A - you 60 points + 7 levels: 10, 8, 7, 6, 5, 2, 2 points / h ×
    × B - you 60 points +7 levels: 5, 6, 7, 8, 9, 10, 11 points / h ×
    × C - you 60 points +7 levels: 20, 2, 2, 2, 2, 2, 2 points / h ×
    × *Select a Partner ID(选择使用账号):限定要英文5 – 12字符。 ×
    × *Select a password(选择密码):限定要英文5 – 12字符。 ×
    × *Retype the password to confirm it(再次输入密码以确认) ×
    × *please tell us how you heard about us?(在哪里获知CashSpace的?) ×
    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    这部分很重要的,你要选仔细呀!(举例来说,A方案是指当你自己上线1小时可获得60点,而你的第一层下 
    线每上线1小时,你就可获得10点的红利回馈,第二层下线上线1小时, 
    则可获得8点的回馈,之后依7, 6, 5, 2. 2点的次序类推; 
    至于B方案、C方案也都是类似的道理!那么该如何决定要选择何种方案呢? 
    假使你打算长期投入这份,且希望在过一段时间之后获得较 
    大的收益,B方案会是你比较好那么假使你希望可以快一点点见到成效, 
    A方案则是可以优先考虑的选择至于C方案的部份,除非你认为往后介绍的 
    朋友几乎不可能再介绍其它人参与这份工作 )×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    × 第四部份是填写介绍人: ×
    × *Referral Info(推荐人):这个部份请你务必不要留空白 ×
    ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××
    所以,请你检视一下字段是不是填着,比如gouldiae_yu (这是我的账号,如果填写我得帐号,我会万分感谢,也可以填写你认识的有号的),
    因为我每天都在挂机, 你一旦加入就会成为我得下线,也就是这个道理,人越多,每小时的点数就越多!!!!待上述数据都填写完毕之后,按Become a Member (成为会员)即完成申请。 基本使用说明 申请完毕后,你会收到来自CashSpace的确认邮件,邮件中有你的会员基本数据,你可以从信件上的链接进入CashSpace网站 ( http://www.cashspace.com/ ), 
    并于网页左侧Download处先行下载广告播放程序(内有两个下载点,一为原始程序,另一则为压缩档),待下载完成
    ,执行该程序,登入后即可开始赚钱。 
    加入完后.. 会开几个网站的,不用管。关闭就可。 
    累计点数的方法。 就打开cashspace 的软件就行了。 
    到了24000点数就 你写上的地址里会邮来支票的。 400美金。 去中国银行换就可以了。 
    拉下线的方法: 
    被推荐的方法。要记得了。。 把您加入的网站的最后部分改成你的ID就可以了。 
    如您的ID是****** 的话 ? 
    http://www.cashspace.com/signup.asp?refID=****** 就这样就可以了。 
    然后像我一样把这篇文章复制了以后找个人多的网站里粘贴就可以了。 
    另外,要特别注意几件事: 
    第一、当漩涡状图样亮起时才算上线,若遇图样暗下时,仅需以鼠标光标 
    由上网下晃过漩涡状图样即可恢复亮起。 右下的图标绿色说明连通,红色说明断开,黄色是待机(鼠标移动即可变绿)
    第二、鼠标光标不可越过漩涡上符号的水平位置,否则将呈现离线状态。 
    你可以把广告条放在桌面的最上面。请记住,这一切都是免费的!!! 
    但是头疼的的是我是在公司上班,那些花花绿绿的画面被领导看到了,怎么办呢?
    想想方法吧,我是将任务管理器打开,然后双击管理器将他调整到广告栏大小,然后盖在上面,希望给打算放弃的人一些帮助 看了这么多如果你想加入的话,别忘了填上我呀http://www.cashspace.com/signup.asp?refID=gouldiae_yu,谢了!!!
    我的qq是:305018471(中午才能上的)
    大家有问题可以联系我,我们共同讨论呀!!!
      

  10.   

    <meta http-equiv="Content-Language" content="gb2312">
      

  11.   

    真正的中文版赚钱软件,不必再为面对一大堆英文注册信息而烦恼,中国第一款网络赚钱软件,谁先加入谁先收益,赶快注册吧。 
    http://www.ads4cn.com/newsbar/refferer.asp?baixiaoh
    等一等!每天的前200个通过我提供的以上地址免费注册的会员,还可以立刻获得¥1.00的注册红包!(快!本奖励可能随时终止。)
    提醒:现在出现一些仿冒NewsBar的网站,为了您的利益能够得到切实保障,请注意鉴别!
    不为别的,只为能让受苦受难的网虫补贴一点点上网的费用。 注册新闻时报,不用投入一分钱,不会占用你太多的时间,只需点点广告,看看新闻,然后到人气旺的论坛站点发帖发邮件,推广你的下线,就能让你在上网的闲暇轻松获得一份额外的收入。(注意:推广下线的时候,上面的网址?以后的内容应改为你注册时的用户名,下面也是。) 
    职业要求--- 1、有上网条件(在家中、办公室、网吧等地);2、每天能有1-2小时上网时间;3、有网络应用的基础(会上论坛发贴子、发电子邮件等)。 
    适合人群---有充足上网时间工资不高的:想上班又不想看老板脸色的;想创业又怕赔钱的;没有钱又不安于现状,不想一辈子碌碌无为的人; 
    赶快注册新闻时报吧,或许你能从这里开创一份真正属于自己的事业 
    http://www.ads4cn.com/newsbar/refferer.asp?baixiaoh
    等一等!每天的前200个通过我提供的以上地址免费注册的会员,还可以立刻获得¥1.00的注册红包!(快!本奖励可能随时终止。)
    提醒:现在出现一些仿冒NewsBar的网站,为了您的利益能够得到切实保障,请注意鉴别!赶快注册新闻时报吧,做soho一族,坐在家里挣钱,穿着睡衣上班,智慧的人看好我们事业,自信的人留在我们事业,坚持的人成就我们事业。 
    http://www.ads4cn.com/newsbar/refferer.asp?baixiaoh
    等一等!每天的前200个通过我提供的以上地址免费注册的会员,还可以立刻获得¥1.00的注册红包!(快!本奖励可能随时终止。)
    提醒:现在出现一些仿冒NewsBar的网站,为了您的利益能够得到切实保障,请注意鉴别!闲着也是闲着,不花一分钱,也不耽误多少时间,试试看吧。 重要问题 1.我不相信新闻时报会给我钱。 
    答:如果新闻时报不给钱,他的广告就会无人光顾,也就不会有人在这里做广告,新闻时报就会失去其存在意义。 2。为什么我看广告,广告商要给我钱。看电视广告可没人给我钱。 
    答:这叫花钱买顾客,电视里的广告商也是在花钱买顾客,只不过钱都花给了电视台,你更乐于接受那种广告? 
      

  12.   

    实现native2ascii ,你可以参考一下
    private String native2ascii (String str){
    String tmp;
    StringBuffer sb = new StringBuffer(1000);
    char c;
    int i, j;
    sb.setLength(0);
    for(i = 0;i<str.length();i++){
    c = str.charAt(i);
    if (c > 255) {
    sb.append("\\u");
    j = (c >>> 8);
    tmp = Integer.toHexString(j);
    if (tmp.length() == 1) sb.append("0");
    sb.append(tmp);
    j = (c & 0xFF);
    tmp = Integer.toHexString(j);
    if (tmp.length() == 1) sb.append("0");
    sb.append(tmp);
    }
    else {
    sb.append(c);
    }
    }return(new String(sb));
    }