返回顶部
首页 > 资讯 > 精选 >如何解决Java编码及网络传输中的编码问题
  • 357
分享到

如何解决Java编码及网络传输中的编码问题

2023-06-17 11:06:38 357人浏览 薄情痞子
摘要

这篇文章给大家介绍如何解决Java编码及网络传输中的编码问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。近来试着FTP搜索,遇到编码问题,研究了下。Java内部的String为Unicode编码,每个字符占两个字节。

这篇文章给大家介绍如何解决Java编码及网络传输中的编码问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

近来试着FTP搜索,遇到编码问题,研究了下。

Java内部的String为Unicode编码,每个字符占两个字节。

Java编解码方法如下:

String str = "hi好啊me";  byte[] gbkBytes=str.getBytes("GBK");//将String的Unicode编码转为GBK编码,输出到字节中  String string=new String(gbkBytes,"GBK");//gbkBytes中的字节流以GBK方案解码成Unicode形式的Java字符串

1、表单数据的编码

现在的问题是,在网络中,不知道客户端发过来的字节流的编码方案(发送前浏览器会对数据编码!!!各个浏览器还不一样!!!)

解决方案如下:

如何解决Java编码及网络传输中的编码问题

当然URLEncoder.encode(str, "utf-8")和URLDecoder.decode(strReceive,"utf-8")方法中的编码方案要一致。

2、网址的编码

但以上方法只适合表单数据的提交;对于URL则不行!!!原因是URLEncoder把'/'也编码了,浏览器发送时报错!!!那么,只要Http://IP/子目录把http://IP/这部分原封不动(当然这部分不要有中文),之后的数据以'/'分割后分段编码即可。

代码如下:

 public static String encodeURL(String str, String encoding) {      final char splitter = '/';      try {          StringBuilder sb = new StringBuilder(2 * str.length());          int start = 0;          for (int i = 0; i < str.length(); i++) {              if (str.charAt(i) == splitter) {                  sb.append(URLEncoder.encode(str.substring(start, i),                          encoding));                  sb.append(splitter);                  start = i + 1;              }          }          if (start < str.length())              sb.append(URLEncoder.encode(str.substring(start), encoding));          return sb.toString();      } catch (UnsupportedEncodingException e) {          e.printStackTrace();      }      return null;  }    public static String encodeURLAfterHost(String str, String encoding) {      final char splitter = '/';       int index = str.indexOf(splitter);/ public static String decodeURLAfterHost(String str, String encoding) {      final char splitter = '/';      int index = str.indexOf(splitter);/ public static String decodeURL(String str, String encoding) {      final char splitter = '/';      try {          StringBuilder sb = new StringBuilder(str.length());          int start = 0;          for (int i = 0; i < str.length(); i++) {              if (str.charAt(i) == splitter) {                  sb.append(URLDecoder.decode(str.substring(start, i),                          encoding));                  sb.append(splitter);                  start = i + 1;              }          }          if (start < str.length())              sb.append(URLDecoder.decode(str.substring(start), encoding));          return sb.toString();      } catch (UnsupportedEncodingException e) {          e.printStackTrace();      }      return null;  }

3、乱码了还能恢复?

问题如下:

如何解决Java编码及网络传输中的编码问题

貌似图中的utf-8改成iso8859-1是可以的,utf-8在字符串中有中文时不行(但英文部分仍可正确解析)!!!毕竟GBK的字节流对于utf-8可能是无效的,碰到无效的字符怎么解析,是否可逆那可不好说啊。

测试代码如下:

package tests;   import java.io.UnsupportedEncodingException;  import java.net.URLEncoder;    public class TestEncoding {      static String utf8 = "utf-8";      static String iso = "iso-8859-1";      static String gbk = "GBK";       public static void main(String[] args) throws UnsupportedEncodingException {          String str = "hi好啊me";          //      System.out.println("?的十六进制为:3F");          //      System.err          //              .println("出现中文时,如果编码方案不支持中文,每个字符都会被替换为?的对应编码!(如在iso-8859-1中)");          System.out.println("原始字符串:\t\t\t\t\t\t" + str);          String utf8_encoded = URLEncoder.encode(str, "utf-8");          System.out.println("用URLEncoder.encode()方法,并用UTF-8编码后:\t\t" + utf8_encoded);          String gbk_encoded = URLEncoder.encode(str, "GBK");          System.out.println("用URLEncoder.encode()方法,并用GBK编码后:\t\t" + gbk_encoded);          testEncoding(str, utf8, gbk);          testEncoding(str, gbk, utf8);          testEncoding(str, gbk, iso);          printBytesInDifferentEncoding(str);          printBytesInDifferentEncoding(utf8_encoded);          printBytesInDifferentEncoding(gbk_encoded);      }            public static void testEncoding(String str, String encodingTrue,              String encondingMidian) throws UnsupportedEncodingException {          System.out.println();          System.out                  .printf("%s编码的字节数据->用%s解码并转为Unicode编码的JavaString->用%s解码变为字节流->读入Java(用%s解码)后变为Java的String\n",                          encodingTrue, encondingMidian, encondingMidian,                          encodingTrue);          System.out.println("原始字符串:\t\t" + str);          byte[] trueEncodingBytes = str.getBytes(encodingTrue);          System.out.println("原始字节流:\t\t" + bytesToHexString(trueEncodingBytes)                  + "\t\t//即用" + encodingTrue + "编码后的字节流");          String encodeUseMedianEncoding = new String(trueEncodingBytes,                  encondingMidian);          System.out.println("中间字符串:\t\t" + encodeUseMedianEncoding + "\t\t//即用"                 + encondingMidian + "解码原始字节流后的字符串");          byte[] midianBytes = encodeUseMedianEncoding.getBytes("Unicode");          System.out.println("中间字节流:\t\t" + bytesToHexString(midianBytes)                  + "\t\t//即中间字符串对应的Unicode字节流(和Java内存数据一致)");          byte[] redecodedBytes = encodeUseMedianEncoding                  .getBytes(encondingMidian);          System.out.println("解码字节流:\t\t" + bytesToHexString(redecodedBytes)                  + "\t\t//即用" + encodingTrue + "解码中间字符串(流)后的字符串");          String restored = new String(redecodedBytes, encodingTrue);          System.out.println("解码字符串:\t\t" + restored + "\t\t和原始数据相同?  "                 + restored.endsWith(str));      }            public static void printBytesInDifferentEncoding(String str)              throws UnsupportedEncodingException {          System.out.println("");          System.out.println("原始String:\t\t" + str + "\t\t长度为:" + str.length());          String unicodeBytes = bytesToHexString(str.getBytes("unicode"));          System.out.println("Unicode bytes:\t\t" + unicodeBytes);          String gbkBytes = bytesToHexString(str.getBytes("GBK"));          System.out.println("GBK bytes:\t\t" + gbkBytes);          String utf8Bytes = bytesToHexString(str.getBytes("utf-8"));          System.out.println("UTF-8 bytes:\t\t" + utf8Bytes);          String iso8859Bytes = bytesToHexString(str.getBytes("iso-8859-1"));          System.out.println("iso8859-1 bytes:\t" + iso8859Bytes + "\t\t长度为:"                 + iso8859Bytes.length() / 3);          System.out.println("可见Unicode在之前加了两个字节FE FF,之后则每个字符两字节");      }            public static final String bytesToHexString(byte[] bytes) {          StringBuilder sb = new StringBuilder(bytes.length * 2);          for (int i = 0; i < bytes.length; i++) {              String hex = Integer.toHexString(bytes[i] & 0xff);// &0xff是byte小于0时会高位补1,要改回0              if (hex.length() == 1)                  sb.append('0');              sb.append(hex);              sb.append(" ");          }          return sb.toString().toUpperCase();      }  }

关于如何解决Java编码及网络传输中的编码问题就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何解决Java编码及网络传输中的编码问题

本文链接: https://lsjlt.com/news/288621.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何解决Java编码及网络传输中的编码问题
    这篇文章给大家介绍如何解决Java编码及网络传输中的编码问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。近来试着FTP搜索,遇到编码问题,研究了下。Java内部的String为Unicode编码,每个字符占两个字节。...
    99+
    2023-06-17
  • python如何解决中文编码乱码问题
    小编给大家分享一下python如何解决中文编码乱码问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、什么是字符编码。要彻底解决字符编码的问题就不能不去了解到底...
    99+
    2023-06-25
  • 如何解决mysql编码问题
    解决mysql编码问题的方法更改数据库安装时的字符编码。打开mysql安装目录。找到my.ini文件,以记事本的方式打开。直接修改配置文件的字符编码为utf8,如:default-character-set=utf8character-se...
    99+
    2024-04-02
  • JAVA中的Unicode编码问题怎么解决
    在Java中解决Unicode编码问题有多种方法:1. 使用正确的字符编码读取和写入文件:当从文件中读取或写入文本时,需要注意使用正...
    99+
    2023-08-19
    JAVA
  • 解决Java中properties文件编码问题
    目录1、properties文件显示乱码问题2、读取properties文件乱码3、Spring boot的@ConfigurationProperties读取properties文...
    99+
    2024-04-02
  • windows中命令行的乱码以及编码的问题该如何解决
    这期内容当中小编将会给大家带来有关windows中命令行的乱码以及编码的问题该如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。解决命令行的乱码以及编码的问题 命令 chcp 功能: 显示或设置活动代...
    99+
    2023-06-14
  • 如何解决PHP base64编码后解码乱码的问题
    如何解决PHP base64编码后解码乱码的问题 PHP base64编码后解码乱码的解决办法:用GET形式传递时,防止【+】号被替换成空格即可,代码为【$str = base64_decode(str_replace(" ","...
    99+
    2023-09-06
    servlet java html
  • python中文编码乱码问题的解决
    目录前言:一、什么是字符编码。1.ASCII2.GB23123.Unicode4.UTF-8二、Python2中的字符编码三、decode()与encode()方法四、一个字符编码的...
    99+
    2024-04-02
  • 解决python3 中的np.load编码问题
    由于在Python2 中的默认编码为ASCII,但是在Python3中的默认编码为UTF-8。 问题: 所以在使用np.load(det.npy)的时候会出现错误提示: you m...
    99+
    2024-04-02
  • Python网络编程中的常见问题及解决方法
    Python网络编程中的常见问题及解决方法引言:在当今互联网时代,网络编程成为了一项重要的技能。Python作为一种功能强大而易学的编程语言,得到了广泛的应用。然而,网络编程中常常会遇到一些问题。本文将介绍一些常见的问题,并给出相应的解决方...
    99+
    2023-10-22
    网络连接问题 数据传输问题 超时处理方法
  • 网络编程中遇到的Python问题及解决方案
    网络编程中遇到的Python问题及解决方案在现代的互联网时代,网络编程扮演着非常重要的角色。而Python作为一门简洁而强大的编程语言,也被广泛应用于网络编程中。然而,在实践中,我们常常会遇到一些问题。本文将介绍一些在网络编程中常见的Pyt...
    99+
    2023-10-22
    解决方案 Python问题 问题关键词: 网络编程 Socket:网络编程中常用的Python模块
  • Python中网络编程的常见问题及解决策略
    Python中网络编程的常见问题及解决策略随着互联网的快速发展,网络编程在我们日常开发中扮演着越来越重要的角色。而Python作为一种简洁高效的编程语言,其在网络编程领域也有着广泛的应用。本文将为大家介绍Python中网络编程常见问题,并提...
    99+
    2023-10-22
    Python网络编程常见问题解决
  • python中的编码和解码及\x和\u问题
    目录编码和解码及\x和\u问题python解析 \x 和 \u "乱码"python2.7解析方法python3解析方法编码和解码及\x和\u问题 “...
    99+
    2024-04-02
  • Java中properties文件编码问题怎么解决
    本文小编为大家详细介绍“Java中properties文件编码问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中properties文件编码问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-06-29
  • 基于restTemplate遇到的编码问题及解决
    目录背景问题一:中文乱码描述分析结论方案总结问题二:特殊字符串丢失描述分析结论方案背景 之前用restTemplate做网络间的请求,没遇到过问题。今天先是出现了中文乱码的问题,而后...
    99+
    2024-04-02
  • 解决uWSGI的编码问题详解
    发现问题 最近工作中遇到一个问题,在把 Flask 写的应用通过 Supervisor+uWSGI 部署到正式服务器上时,出现了这样的错误: Unable to print the message an...
    99+
    2022-06-04
    详解 uWSGI
  • 如何解决MySQL字符集编码问题
    这篇文章给大家分享的是有关如何解决MySQL字符集编码问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。项目中,用中断命令导入sql脚本,发现其报出编码错误,后来进过一番分析查询...
    99+
    2024-04-02
  • Python 网络编程常见问题及解决方法
    无法解析主机名或 IP 地址 这是 Python 网络编程中常见的错误之一,通常发生在尝试连接到不存在或无效的服务器时。 解决方法: 确认服务器是否存在并正在运行。 确保您使用的主机名或 IP 地址是正确的。 检查您的网络连接是否...
    99+
    2024-02-13
    Python 网络编程 常见问题 问题解决
  • Python3如何解决字符编码问题详解
    编码 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制1111...
    99+
    2022-06-04
    如何解决 详解 字符
  • 如何理解网络Fedora gcc编译中的问题
    如何理解网络Fedora gcc编译中的问题,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。全面介绍Fedora gcc编译, 这里我发表一下个人理解,这里将介绍Fedora...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作