在开发的时候,经常会碰到一个问题,本地无乱码而部署到服务器上后服务器出现了乱码,在此记录下我的解决方法:

一直以来我都有一个误区,一直认为“字节无编码,字符串有编码”,而事实刚好相反,事实上是“字符串无编码,字节有编码”。

不同编码,中文和英文字符所占字节不同,UTF_8是一种变长的编码方式,对英文字符使用单字节编码,对中文字符使用三个字节来编码;而GBK是国家制定的汉字编码标准,使用双子节进行编码,所以不同的编码,将字节转成字符的方式不同。而Java 字符串是由一串字符数组char[]组成,字符是由字节组成,一个中文和一个英文字母都是占一个字符,Java代码在显示String时,需要将字节根据编码(UTF或GBK或其他)转成字符,然后组成字符数组char[]显示,这就是说明了“字符串无编码,字节有编码”。

所以,我们在接收消息时进行编码转码时,需要将接收的消息以该消息的编码方式解码成字符串,然后将字符串以我们需要编码进行编码,即:

byte[] gbkByteArr = 字节流接收消息,获得接收消息字节流数组;

String gbkMsg = new String(gbkByteArr  ,"GBK")  //用消息的编码进行解码,假如消息编码方式是GBK,此处就用GBK解码;  到此得到的字符串应该就是无乱码的字符串

往往出现乱码不是解码出错,而是认为在得到gbkMsg后无乱码后,Java编码解码就结束了,其实这只是第一步,我们仍需对gbkMsg进行编码,将其转成我们需要的编码。具体如下:

byte[] utf8ByteArr = gbkMsg .getBytes(UTF_8); //如果需要的消息UTF_8,在此将gbkMsg 转成UTF_8的字节数组,在此一定要指定编码方式,不然Java会按JVM设置的编码进行编码,如果JVM未指定编码,会根据当前操作系统的编码指定,不同的服务器上虚拟机JVM或操作系统有可能设置的编码不同,就造成了不同服务器有的出现乱码,有的正常。我就是由于此步骤未设置编码,造成了本地服务器正常,而线上服务器乱码。

Strign utf8Msg = new String(bytes_emt , UTF_8); //获得以UTF_8编码的字节数组utf8ByteArr对应的字符串

总结:针对不同编码的转换(以GBK--转UTF_8为例)方式:

1、先将消息以字节流方式获取,获得字节数组byte[] gbkByteArr ;

2、将字节以“GBK”的方式解码,获得字符串gbkMsg

3、将字符串gbkMsg 以“UTF_8”的方式编码,获得编码是UTF_8的字节流byte[] utf8ByteArr

4、然后将字节流utf8ByteArr以UTF_8的方式转成字符串

java数组乱码_Java 乱码问题相关推荐

  1. java 数组 反射_java数组的反射

    java数组的反射,有一个JAVA API类可以运用:java.lang.reflect.Array 具体应用: 1:判断一个对象是否是数组: int arr[] = {1,2,3}; Class c ...

  2. java数组缓冲_java – 何时使用数组,缓冲区或直接缓冲区

    题 在编写用于OpenGL库的Matrix类时,我遇到了使用Java数组或Buffer策略来存储数据的问题(JOGL为Matrix操作提供直接缓冲区副本).为了分析这一点,我写了一个小型性能测试程序, ...

  3. Java数组参考_Java数组

    数组变量 VS 数组对象 先看一例子: int[] primitiveArray; //在栈中声明了一个引用变量,暂时还没指向任何对象 primitiveArray = new int[5]; //在 ...

  4. java 数组写法_java书写、数据类型、数组定义

    这里只记录java与php.javascript不同的地方,相同的地方就不赘述了. 1.java文件源码为以.java为后缀的文件,字节码文件是以.class为后缀的文件. 2.写好一个java源码之 ...

  5. java数组 方法_Java数组的十大方法

    Java数组的十大方法 以下是Java Array的前10种方法.他们是来自stackoverflow的投票最多的问题. 0.声明一个数组 String[] aArray = new String[5 ...

  6. java 数组效率_java数组复制的四种方法效率对比

    有关数组的基础知识,有很多方面,比方说初始化,引用,遍历,以及一维数组和二维数组,今天我们先看看数组复制的有关内容. 来源于牛客网的一道选择题: JAVA语言的下面几种数组复制方法中,哪个效率最高? ...

  7. java 数组成员_java 数组中含有

    <数据结构与抽象:Java语言描述(原书第4版)>一2.2.1 可变大小数组 本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.2. ...

  8. java 数组 指针_java指针数组的使用

    1,一直都在学java是没有指针的,让我纠结的是java指针确实是存在的,java数组就是真正的指针. 以为C语言老师说过C语言里数组就是指针,但是我感觉这句话用在C语言里不是很严谨,而用在java里 ...

  9. java 数组删除_Java数组删除指定元素的方法(按数组角标删除)

    Java最有效的删除数组指定元素的方法,应该属于这一种形式,下面是Java数组按角标删除数据的工具类,代码如下:public static byte[] removeTheElement(byte[] ...

  10. java数组更新_java数组

    数组无论在哪种编程语言中都算是最重要的数据结构之一,同时不同语言的实现及处理也不尽相同.但凡写过一些程序的人都知道数组的价值及理解数组的重要性,与链表一道,数组成为了基本的数据结构.尽管Java提供了 ...

最新文章

  1. java的static关键字
  2. PNAS:微生物组分析揭示人类皮肤的独特性
  3. IIS6的PHP最佳配置方法
  4. concat mysql sql注入_sql注入-mysql注入基础及常用注入语句
  5. 在家办公的第一天,钉钉、企业微信集体“崩溃”...
  6. Squid在企业中的应用
  7. barbuttonitem 文字换行_IOS TableView的Cell高度自适应,UILabel自动换行适应
  8. 从 github 执行 git clone 一个大的项目时提示 error: RPC failed
  9. 四则运算2的单元测试
  10. 无人车火了 百度是如何做到的?
  11. 一看就会的 GitHub 骚操作,让你看上去像一位开源大佬
  12. Python 标准库 —— urllib(下载进度)
  13. windows进行udp端口转发
  14. AWS云上混沌工程实践之启动篇
  15. 怎样搜索计算机中docx格式的文件,如何打开docx文件 打开docx文件方法
  16. Node.js从入门到精通
  17. golang之jsonb类型的支持
  18. 四川省评高级教师考职称计算机,四川省中学教师中、高级职称评审条件
  19. 如何更快地渲染?深入了解3D渲染性能的指南!(5)
  20. Android 连接wifi 检测是否需要portal 认证

热门文章

  1. android检测蜂窝网络,Android 判断网络状态及开启网路
  2. 工具----9、浏览器攻击框架--(BeEF)
  3. 第五节:蜂鸣器的驱动程序
  4. matplotlib科研绘图---Times New Roman字体设置
  5. matlab仿真平台式惯导
  6. StudentManageSystem(学生管理系统)
  7. 1325:【例7.4】 循环比赛日程表 2020-12-18
  8. 2022系统分析师--案例必备知识点汇总
  9. 感知机原理以及python实现
  10. Ultimate Tic-Tac-Toe