中文乱码问题

Scrapy爬虫之中文乱码问题 问题描述: I. #这是.csv格式的文件,有中文乱码现象。 [root@Uu jianshu]# cat jianshu.csv url,title,author http://www.jianshu.com/p/2a7a594816e1,彖浣犳 村?鏍? [root@Uu jianshu]# ... 阅读详情

 

1.字节和unicode
    java
内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式是使用字节流的。因此java要对这些字节流经行转化。char是unicode的,而byte是字节。java中byte/char互转的函数在sun.io的包中间有。其中ByteToCharConverter类是中调度,可以用来告诉你,你用的convertor。其中两个很常用的静态函数是 
public static ByteToCharConverter getDefault(); 
public static ByteToCharConverter getConverter(String encoding); 
如果你不指定converter,则系统会自动使用当前的encoding,gb平台上用gbk,en平台上用8859_1。
byte ——
〉char:
 "
你"的gb码是:0xc4e3 ,unicode是0x 4f 60
  String encoding = "gb2312";
  byte b[] = {(byte)'/u 00c 4',(byte)'/u00e3'};
  ByteToCharConverter converter = ByteToCharConverter.getConverter(encoding);
  char c[] = converter.convertAll(b);
  for (int i = 0; i < c.length; i++) {
      System.out.println(Integer.toHexString(c[i]));
  }
 
结果是什么?0x 4f 60
 
如果encoding ="8859_1",结果又是什么?0x 00c 4,0x00e3
 
如果代码改为
 byte b[] = {(byte)'/u 00c 4',(byte)'/u00e3'};
 ByteToCharConverter converter = ByteToCharConverter. getDefault();
 char c[] = converter.convertAll(b);
 for (int i = 0; i < c.length; i++) {
    System.out.println(Integer.toHexString(c[i]));
 }
 
结果将又是什么?根据平台的编码而定。

 char ——
〉byte:
    String encoding = "gb2312";
    char c[] = {'/u 4f 60'};
    CharToByteConverter converter = CharToByteConverter.getConverter(encoding);
    byte b[] = converter.convertAll(c);
    for (int i = 0; i < b.length; i++) {
       System.out.println(Integer.toHexString(b[i]));
    }
结果是什么?0x 00c 4,0x00e3
如果encoding ="8859_1",结果又是什么?0x 3f
如果代码改为
String encoding = "gb2312";
    char c[] = {'/u 4f 60'};
    CharToByteConverter converter = CharToByteConverter.getDefault();
    byte b[] = converter.convertAll(c);
    for (int i = 0; i < b.length; i++) {
       System.out.println(Integer.toHexString(b[i]));
    }
结果将又是什么?根据平台的编码而定。
很多中文问题就是从这两个最简单的类派生出来的。而却有很多类不直接支持把encoding输入,这给我们带来诸多不便。很多程序难得用encoding了,直接用default的encoding,这就给我们移植带来了很多困难。

2.utf-8
utf-8
是和unicode一一对应的,其实现很简单
7
位的unicode: 0 _ _ _ _ _ _ _ 
11
位的unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _ 
16
位的unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 
21
位的unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 
大多数情况是只使用到16位以下的unicode: 
"
你"的gb码是:0xc4e3 ,unicode是0x 4f 60
    0xc4e3
的二进制:
          1100 
,0100 ,1110 ,0011
由于只有两位我们按照两位的编码来排,但是我们发现这行不通,因为第7位不是0因此,返回"?"
    0x 4f 60
的二进制:
               0100 
,1111 ,0110 ,0000
         
我们用utf-8补齐,变成:
               1110 
,0100 ,1011 ,1101 ,1010 ,0000
         e4--bd-- a0
         
于是返回:0xe4,0xbd,0xa0。

3.string
和byte[]
string
其实核心是char[],然而要把byte转化成string,必须经过编码。string.length()其实就是char数组的长度,如果使用不同的编码,很可能会错分,造成散字和乱码。
例如:
String encoding = “”;
byte [] b={(byte)'/u 00c 4',(byte)'/u00e3'}; 
String str=new String(b,encoding);
  
如果encoding=8859_1,会有两个字,但是encoding=gb2312只有一个字这个问题在处理分页是经常发生 。

4.Reader,Writer / InputStream,OutputStream
Reader
和Writer核心是char,InputStream和OutputStream核心是byte。但是Reader和Writer的主要目的是要把char读/写InputStream/OutputStream。
例如:
文件test.txt
只有一个"你"字,0xc4,0xe3
String encoding = "gb2312";
    InputStreamReader reader = new InputStreamReader(new FileInputStream(
        "text.txt"), encoding);
    char c[] = new char[10];
    int length = reader.read(c);
    for (int i = 0; i < length; i++) {
       System.out.println(c[i]);
    }
结果是什么?你
如果encoding ="8859_1",结果是什么???两个字符,表示不认识。
反过来的例子自己做。

5.
我们要对java的编译器有所了解:
javac ?encoding
我们常常没有用到encoding这个参数。其实encoding这个参数对于跨平台的操作是很重要的。如果没有指定encoding,则按照系统的默认encoding,gb平台上是gb2312,英文平台上是iso8859_1。
java
的编译器实际上是调用sun.tools.javac.main的类,对文件进行编译,这个类有compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。编译器就是根据这个变量来读取java文件的,然后把用utf-8形式编译成class文件。
例子代码:
String str = "
你";
    FileWriter writer = new FileWriter("text.txt");
    write.write(str);
    writer.close();

如果用gb2312编译,你会找到e4 bd a0的字段 ;
如果用8859_1编译,  00c 4 00e3的二进制: 
0000
,0000 ,1100,0100 ,0000,0000 ,1110,0011
因为每个字符都大于7位,因此用11位编码: 
1100
,0001,1000,0100,1100,0011,1010,0011 
c1-- 84--
 c3--  a3 
你会找到c1 84 c3 a3 。

但是我们往往忽略掉这个参数,因此这样往往会有跨平台的问题:
样例代码在中文平台上编译,生成zhclass
样例代码在英文平台上编译,输出enclass
  (1).
  zhclass在中文平台上执行ok,但是在英文平台上不行 
  (2).    enclass
在英文平台上执行ok,但是在中文平台上不行
原因:
  (1).    
在中文平台上编译后,其实str在运行态的char[]是0x 4f 60, 在中文平台上运行,filewriter的缺省编码是gb2312,因此 chartobyteconverter会自动用调用gb2312的converter,把str转化成byte输入到fileoutputstream中,于是0xc4,0xe3放进了文件。 
但是如果是在英文平台下,chartobyteconverter的缺省值是8859_1, filewriter会自动调用8859_1去转化str,但是他无法解释,因此他会输出"?"
  (2).    
在英文平台上编译后,其实str在运行态的char[]是0x 00c 4 0x00e3, 在中文平台上运行,中文无法识别,因此会出现??;
在英文平台上,0x 00c 4-->0xc4,0x00e3->0xe3,因此0xc4,0xe3被放进了文件。

6.    
其它原因:<%@ page contentType="text/html; charset=GBK" %>
设置浏览器的显示编码,如果response的数据是utf8编码,显示将是乱码,但是乱码和上述原因还不一样。

7.    
发生编码的地方:
    
从
l数据库到java程序 byte——〉char
    
从
ljava程序到数据库 char——〉byte
    
从
l文件到java程序 byte——〉char
    
从
ljava程序到文件 char——〉byte
    
从
ljava程序到页面显示 char——〉byte
    
从页面form提交数据到
ljava程序byte——〉char
    
从流到
ljava程序byte——〉char
    
从
ljava程序到流char——〉byte

谢志钢的解决方法:
我是使用配置过滤器的方法解决中文乱码的:

<web-app>
  <filter>
    <filter-name>RequestFilter</filter-name>
    <filter-class>net.golden.uirs.util.RequestFilter</filter-class>
    <init-param>
      <param-name>charset</param-name>
      <param-value>gb2312</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>RequestFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
</web-app>


  public void doFilter(ServletRequest req, ServletResponse res,
                       FilterChain fChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession();
    String userId = (String) session.getAttribute("userid");
req.setCharacterEncoding(this.filterConfig.getInitParameter("charset")); // 
设置字符集?
实际上是设置了byte ——〉char的encoding
    try {
      if (userId == null || userId.equals("")) {
        if (!request.getRequestURL().toString().matches(
            ".*/uirs/logon/logon(Controller){0,1}//x2Ejsp$")) {
          session.invalidate();
          response.sendRedirect(request.getContextPath() +
                                "/uirs/logon/logon.jsp");
        }
      }
      else { // 
看看是否具有信息上报系统的权限
        if (!net.golden.uirs.util.UirsChecker.check(userId, "
信息上报系统",
            net.golden.uirs.util.UirsChecker.ACTION_DO)) {
          if (!request.getRequestURL().toString().matches(
              ".*/uirs/logon/logon(Controller){0,1}//x2Ejsp$")) {
            response.sendRedirect(request.getContextPath() +
                                  "/uirs/logon/logonController.jsp");
          }
        }
      }
    }
    catch (Exception ex) {
      response.sendRedirect(request.getContextPath() +
                            "/uirs/logon/logon.jsp");
    }
    fChain.doFilter(req, res);
  }

【Python计量】linearmodels面板数据回归(一) 我们以伍德里奇《计量经济学导论现代方法》的”第14章高级面板数据方法“的案例14.1为例,使用jtrain中的数据来进行固定效应估计。 阅读详情

相关推荐

教你读懂techpoint视频解码芯片tp2855规格书(第一部分)

所有的控制环都是可编程的,以实现最大化的灵活性。对于NTSC/PAL输入,输出时钟和采样结构是非标准的,以便在多路复用输出时与HD格式一同工作。所有通道的音频数据都可以选择性地级联,以实现最大的灵活性。TP2855是一款通用的高清/标清视频解码器芯片,其支持对HD-TVI、NTSC/PAL制式960H分辨率及普通AHD视频格式的解码。TP2855具有内部钳位,在每个通道上都有自动增益控制放大器,用于最佳的信号调节。即使在使用低质量和长线缆的条件下,它的可编程均衡放大器和自动控制环也能维持尚佳的表现。

hufan92的博客 4918

常见中文乱码问题以及解决方案(web版)

在平常我们开发的过程中,可能会遇到各种各样的问题,其中中文乱码问题是最普遍最麻烦的,因为寻常的中文乱码会有各种形式,有前端原因,也有后台原因,所以需要具体问题具体分析。下面将从几个常见乱码问题入手,分析其原理,给出解决方案,以便到后续开发中能够尽量避免此问题的发生。目录引言一、问题阐述与分析 1.1 IDEA控制台乱码问题 1.2 页面乱码问题 1.3 前台参数乱码问题 1.4 数据库插入乱码问题 1.5 服务器乱码问题 1.6 ​​​​​​​CSV等文件中文乱码问题 ​​​​​​​1.7 ​​​​​​​U

qq_42374880的博客 4万+

PADS VX2.7学习记录06-PADS Router软件功能操作

PADS VX2.7学习记录06-PADS Router软件功能操作

qq_31444421的博客 7860

中文乱码的原因及解决方法

1、我们常用的编码表:   ASCLL:美国标准信息交换码      --->用一个字节的7位可以表示 ISO8859-1:拉丁码表、欧洲码表     --->用一个字节的8位来表示 GB2312:中国的中文编码表 GBK:中国的中文编码表的升级。       --->一个汉字用两个字节表示,每个字节的高位是1,所以汉字的byte形式是负数。 Unicode:国际标准码,融合了多种

u011521890的专栏 55万+

富斯遥控器-ros机器人控制

富斯遥控器-ros机器人手柄控制

zkh7758的博客 1700

Speedtree学习笔记(案例)——拥有多种材质的植物如何导入使用(以草为例)

注:Speedtree无论保存还是导入模型其存储路径不可有中文。 第一步拆分草的模型 根据所需的材质去拆分(例:假若草的果实,茎秆和叶子是不同的材质那么就需拆分为三份;假若画的全部颜色及材质一样就没有必要去拆分模型) 第二步导入草的模型 在Mesh面板中依次导入草的模型——Do nothing additional right now 第三步扩大草的生长区域范围(可省略)...

L人青的博客 5722

中文出现乱码最常见的几种方式解析

5、长度为奇数时,最后的字符变成问号,以GBK读取UTF-8编码,再用UTF-8格式再次读取。6、大部分文字为锟斤拷,以UTF-8方式读取GBK码,再次用GBK格式再次读取。4、拼音码,带声调的字母,以ISO8859-1方式读取GBK。3、各种符号,以ISO8859-1方式读取UTF-8。1、出现古文夹杂日韩文,以GBK读取UTF-8编码。2、出现方块形,以UTF-8读取GBK。

wjbltxx的专栏 7286

实战解析:在.NET中实现Dify API流式请求与响应的完整方案

本文详细解析了在.NET应用中对接Dify API时实现流式请求与响应的完整方案。针对传统后端“接收完才返回”的痛点,文章提供了基于ASP.NET Core的实战代码,通过配置HttpCompletionOption.ResponseHeadersRead和手动Flush响应流,构建高效的中转管道,确保AI回复能够像ChatGPT一样实时逐字推送到前端,显著提升用户体验。

weixin_29267307的博客 296

socket中文乱码问题

问题描述: 后端向前端发送中文,前端显示正常 前端向后端发送中文,后端显示乱码 解决: 前端js引入 最新版的 socket.io.js,不能使用socket.io.min.js <script src="{{url_for('static',filename='js/socket.io.dev.js')}}"></script> ...

syousetu的博客 1万+

PSF(点扩散函数)与去卷积算法消除图像模糊

本文旨在总结图像处理中使用去卷积的传统方法来进行图像去模糊的相关知识。

m0_53607446的博客 6014

Winform从入门到精通(2)——Button(史上最全)

本文介绍winform中Button控件的详细用法,包括所有属性和事件

qq_34059233的博客 1万+

中文乱码问题总结

转自:http://www.52testing.com/showart.asp?id=59  一 概述     在我们测试Web应用项目的时,经常会遇到中文乱码问题,我也是在做框架测试时遇到这类情况,为什么会有中文乱码呢?带着这个疑问,对中文乱码问题产生的由来做了大致的分析,希望对各位有用。     二 字符集介绍     我们知道在计算机中,只有二进制的数据,不管数据是在内存中,

nashviller的专栏 1953

手把手教你学 Simulink (1.3)--Simulink 的模块库及其模块介绍

Simulink 提供了丰富的模块库,涵盖了从基本的信号生成和处理到复杂的数学运算和系统建模的各种功能。通过熟悉这些模块库及其模块,你可以更高效地构建和仿真动态系统。

MHD0815的博客 5150

json中文出现乱码问题

在使用json传输中文的时候,可能会遇到乱码问题,这是编码格式有问题。 可以在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置!可解决大部分乱码问题。 <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.String

justice-long的博客 2705

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

解决HTML中文乱码问题

学习前端知识的时候遇到了中文乱码问题 检查代码发现并没有问题 charset=“utf-8” <!DOCTYPE HTML> <html > <head> <meta http-equiv="Content-Type" content="text/html; charset="utf-8" /> <title>流程控制语句</ti...

qq_41870790的博客 1330

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

简单解决jsp中文乱码问题

简单解决jsp中文乱码问题 初学jsp制作一个简单的响应页面 具体代码如下: <form action="test.jsp"> username : <input type="text" name="username" /> <br /> <input type="submit"> </form> Hello <%=request.getParameter("username")%> 保存为test.jsp文

ws15168689087的博客 2万+

JSP解决中文乱码问题

一、JSP页面显示乱码 二、表单提交中文时出现乱码 三、数据库连接 大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。 一、JSP页面显示乱码 下面的显示页面(display.jsp)就出现乱码:        JSP的中文处理

三石的专栏 980

Servlet中文乱码问题

最近在学习Servlet中文乱码的时候,出现了一些问题,当 我把response的编码设置成utf_8的时候,在谷歌浏览器输入地址访问的时候,仍然出现了乱码,

weixin_43222528的博客 263

用 JSON 来避免中文乱码问题

问题来源 第一步 深坑 迷茫后的光芒 如何解决 光明 总结问题来源最近在用别人提供的 API 搞事情(用姓名和身份证号查准考证号), 用 Postman 进行测试,提交的是表单里面含有中文。具体如下图:我按照上面的教程,确实可行,如下图:乐于助人的我,想做个 Web 网站来帮助一些人,so,我开始用 Postman 进行测试。第一步我打开 谷歌游览器 的开发人员工具(F12) Network 项,看

我所有的向往 2万+

servlet中文乱码问题

一、常识了解   1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.java.nio.charset.Charset.defaultCharset() 获得平台默认字符编码; 3.getBytes() 是通过平台默认字符集进行编码;   二、中文乱码出现   在学习任何一门技术时,经常会有初学者遇到中文乱码

二次加工是一种痛 569

一次解决Mac终端中文乱码问题

文章目录使用oh-my-zsh查看中文目录显示乱码描述解决方法使用git status中文文件显示乱码描述解决方法参考文章 使用oh-my-zsh查看中文目录显示乱码 描述 在使用ls指令查看目录时,对于中文目录会显示乱码 原因是locale没有设置成utf-8 解决方法 终端输入: vi ~/.zshrc 在文件末尾添加: export LC_ALL=en_US.UTF-8 e...

KevinAshen的博客 6471

Jython中文乱码问题

在java中调用jython执行python脚本,脚本中的中文出现乱码,脚本如下: import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.python.core.Py; import org.python.core.PyFunction; import org.python.core...

weixin_47328207的博客 1348

Android关于中文乱码问题

服务器响应返回中文乱码 我的程序是使用HttpURLConnection连接服务器,获取服务器上的JSON数据,但是JSON里面含有中文,客户端得到中文是乱码的。网上有许多的修改程序,但是都不成功。下面例子经过我的测试是成功的 主要是使用这一句代码 InputStreamReader in = new InputStreamReader(urlConnection.getInputStr...

qq_42839797的博客 556
上一篇: MD5/SHA1,DSA,DESede/DES,Diffie-Hellman的使用
下一篇: Java2D介绍
lanjun2005
博客等级 码龄21年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值