zoukankan      html  css  js  c++  java
  • Android InputStream接收 字符串乱码 问题

    各个国家和地区所制定的不同 ANSI 编码标准中,都只规定了各自语言所需的“字符”。比如:汉字标准(GB2312)中没有规定韩国语字符怎样存储。这些 ANSI 编码标准所规定的内容包含两层含义:
    1. 使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。
    2. 规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。
    各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。
    “UNICODE 字符集”包含了各种语言中使用到的所有“字符”。用来给 UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。
    1、ISO-8859-1:
    最简单的编码规则,每一个字节直接作为一个 UNICODE 字符。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "ÖÐ"。
    反之,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。

    2、GB2312,BIG5,Shift_JIS,ISO-8859-2
    把 UNICODE 字符串通过 ANSI 编码转化为“字节串”时,根据各自编码的规定,一个 UNICODE 字符可能转化成一个字节或多个字节。
    反之,将字节串转化成字符串时,也可能多个字节转化成一个字符。比如,[0xD6, 0xD0] 这两个字节,通过 GB2312 转化为字符串时,将得到 [0x4E2D] 一个字符,即 '中' 字。
    “ANSI 编码”的特点:
    1. 这些“ANSI 编码标准”都只能处理各自语言范围之内的 UNICODE 字符。
    2. “UNICODE 字符”与“转换出来的字节”之间的关系是人为规定的。

    3、UTF-8,UTF-16,UnicodeBig
    与“ANSI 编码”类似的,把字符串通过 UNICODE 编码转化成“字节串”时,一个 UNICODE 字符可能转化成一个字节或多个字节。
    与“ANSI 编码”不同的是:
    1. 这些“UNICODE 编码”能够处理所有的 UNICODE 字符。
    2. “UNICODE 字符”与“转换出来的字节”之间是可以通过计算得到的。【以上内容百度理解,具体看代码实现效果】
    服务端 基于java Servlet后台

    String result= "fial";
    String username=request.getParameter("username");
    String pwd=request.getParameter("password");
    if(username.equals("admin")&&pwd.equals("123456")){
    result="登入成功";
    }

    byte[] bytes = result.getBytes();
    String str = new String(bytes, "iso-8859-1");
    PrintWriter out=response.getWriter();
    out.write(str);


    Android 后台代码

    public String sendPost(String url, String params) {
    String result="";
    try {
    URL realurl = new URL(url);
    HttpURLConnection conn = (HttpURLConnection) realurl.openConnection();
    conn.setDefaultRequestProperty("Content-Type", "text/html;charset=utf-8");
    conn.setConnectTimeout(6000); // 设置超时时间
    conn.setRequestMethod("POST");
    DataOutputStream out = new DataOutputStream(conn.getOutputStream());
    out.writeBytes(params);
    out.flush();
    out.close();
    InputStream in = conn.getInputStream();

    BufferedReader reader = new BufferedReader(new InputStreamReader(in,"GB2312"));
    String line = "";
    while ((line = reader.readLine()) != null) {
    // result=new String(line.getBytes("iso-8859-1"),"utf-8");
    result=line;

    }

    } catch (MalformedURLException eio) {
    result= eio.getMessage();
    eio.printStackTrace();
    } catch (IOException e) {
    result=e.getMessage();
    e.printStackTrace();
    }
    return result;
    }



    每一份坚持,以后都会有收获
  • 相关阅读:
    SQLSERVER 2008 编辑所有或者任意行
    在SQL2008和2012里面怎么让显示全部行和编辑 全部而不是200和1000
    sql server 提取汉字/数字/字母的方法
    [再寄小读者之数学篇](2014-05-12 曲线的弧长计算)
    [复变函数]第23堂课 6.2 用留数定理计算实积分 (续)
    [再寄小读者之数学篇](2014-04-23 行列式的导数)
    [再寄小读者之数学篇](2014-04-22 平方差公式在矩阵中的表达)
    康乐不风流之爱解题的pde灌水王张祖锦
    [复变函数]第22堂课 6.2 用留数定理计算实积分
    [Tex学习笔记]数学公式再次测试
  • 原文地址:https://www.cnblogs.com/wilsons/p/6084993.html
Copyright © 2011-2022 走看看