关于InputStreamReader编码方式的问题

    今天在做一个发送短信的功能时,碰到了一个关于读取InputStreamReader出现乱码的问题,但这个问题诡异的是,测试时候没有出现问题,但使用的时候就出现乱码了,先贴出方法代码,这段代码也是短信接口开发的demo:

package com.langgelila.sendsms;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class SendSms {

    public static void main(String[] args) {
        String aa = sendSms("111111111", "时间是自然界的一部分,同时地球上的万事万物都在受着时间的制约,它的存在就如同空间的存在一样【朗格里拉科技】");
        System.out.println(aa);

    }

    /**
     * @param mobies 手机号码(多个手机号码之间用英文半角“,”隔开,单次最多支持5000个号码)
     * @param content 短信内容,超过长度会分拆为多条
     * @return 
     * replyCode 整型    执行结果 1 成功 0失败 <br>xi
     * replyMsg Text 成功或失败原因具体信息 <br>
     * succeedNum 整型   成功条数(当次提交成功的手机号码个数)  <br>
     * failedNum 整型    失败条数(当次提交失败的手机号码个数) <br>
     * chargCount 整型   计费条数(当次提交计费的短信条数) <br>
     * deduction 整型    计费金额(当次提交的计费金额,单位:厘)  <br>
     * balance 整型      余额(当次提交后的账户余额:单位:厘) <br>
     */
    public static String sendSms(String mobies, String content) {
        StringBuffer sb = new StringBuffer("http://www.lx198.com/sdk/send?");
        String accName = "";  //短信接口用户名
        String accPwd = "";   //短信接口密码
        try {
            sb.append("&accName=" + accName);
            sb.append("&accPwd=" + MD5.getMd5String(accPwd));
            sb.append("&aimcodes=" + mobies);
            sb.append("&content=" + URLEncoder.encode(content, "UTF-8"));
            sb.append("&bizId=" + BizNumberUtil.createBizId());
            sb.append("&dataType=string");
            URL url = new URL(sb.toString());
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setRequestMethod("POST");
            InputStreamReader inp = new InputStreamReader(url.openStream());
            BufferedReader in = new BufferedReader(inp);
            String returninfo = in.readLine();
            return returninfo;
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }
}

        当我执行main时,成功发送短信,回执结果是:“1;发送成功!;1;0;1;60;832600; ”这个时候,回执中汉字是正确的,但是我在其他方法中使用这段代码时,诡异的一幕出现了,回执结果是:“1;鍙戦�鎴愬姛!!;1;0;1;60;832600;”

引用的方式是:

String returnstr = SendSms.sendSms(phone,content);

整个项目都是UTF-8格式的,于是我询问短信提供商,得到回复说,使用的也是UTF-8,于是我debug了一下,加入代码:

System.out.println("getEncoding:"+inp.getEncoding());

这个时候,出现了一个更诡异的现象,执行main时,打印的是:getEncoding:UTF8,而在其他方法中引用的时候,打印的是:getEncoding:GBK,这让我百思不得其解。

最后的解决方法是将

 InputStreamReader inp = new InputStreamReader(url.openStream());

修改为:

InputStreamReader inp = new InputStreamReader(url.openStream(),"UTF-8");

强制使用UTF-8读取,结果算是正确了,但我心中的问题还是没有解决:

1、为何main中执行结果正确,其他方法引用则不正确;

2、InputStreamReader在传递过程中自己能修改编码方式吗;

当然,除去这些问题,本文也解决了一系列问题:

1、短信接口开发的demo;

2、提供了一个处理InputStreamReader乱码问题的方式。

你可能感兴趣的:(关于InputStreamReader编码方式的问题)