9.1 常见字符集

常见字符集包括:

  • ASCII(American Standard Code for Information Interchange):美国标准信息交换代码,主要用于英语字符的编码,包含128个字符。

  • ISO-8859系列:国际标准化组织制定的一系列单字节编码方案,如ISO-8859-1(Latin-1),支持西欧语言字符;ISO-8859-6用于阿拉伯语等。

  • GB2312/GBK:中国国家标准字符集,主要用于简体中文字符。GB2312是基本集,GBK是其扩展版本,包含了更多的汉字和符号。

  • Unicode(UTF-8、UTF-16)

    • UTF-8:可变长度的多字节编码,广泛应用于网页和文件存储,能表示全世界几乎所有的字符,兼容ASCII。
    • UTF-16:固定或可变长度的编码方式,每个字符使用2个或4个字节来表示,常用于内部程序处理,尤其是Java平台。
  • Big5:主要针对繁体中文字符的一种编码方式。

  • EUC-KR:韩国字符集,用于韩文编码。

  • Shift_JIS:日本字符集,用于日文编码。

9.2 乱码原因

Java语言内部采用Unicode字符集来表示字符,一旦与外界的程序打交道就会存在一个字符转换的过程。

对于Java Web应用程序,客户端浏览器采用默认的字符集(通常是GBK),而Web容器对POST提交的数据采用ISO-8859-1的编码方式,数据在这些系统中穿梭很可能就会出现乱码的问题。

乱码出现的原因通常有以下几点:

  1. 编码不一致:数据在创建、传输或存储过程中使用的字符集不一致,例如源文本用UTF-8编码,但接收端按照GBK进行解码。

  2. 默认字符集设置错误:Web服务器、数据库、浏览器或操作系统对默认字符集的设定与实际数据的编码格式不符。

  3. 未正确指定字符集:在HTTP响应头中没有明确指定Content-Type以及charset参数,导致客户端无法准确解析内容。

  4. 文件读写时字符集转换不当:在读取或写入文件时,没有正确转换字符集或者没有指定正确的编码方式。

9.3 解决乱码

解决乱码问题的方法:

  1. 统一字符集:确保在整个数据流转过程中,各个环节(如页面、数据库、服务器配置)均采用相同的字符集。

  2. 指定字符集

在HTML文档中通过<meta>标签声明网页字符集:

     <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

在HTTP响应头部指定字符集:

     Content-Type: text/html; charset=utf-8

在Java编程中,解决服务器返回页面中文乱码问题:

   response.setContentType("text/html;charset=UTF-8");

解决post方式请求表单参数中文乱码问题:

 request.setCharacterEncoding("UTF-8");//注意此语句一定要设置在取参数的语句之前

解决get方式请求中文参数乱码问题:

//修改server.xml
<Connector port="8080" protocol="HTTP/1.1" maxThreads="150" connectionTimeout="20000"
  redirectPort="8443" URIEncoding="UTF-8"/>
  1. 数据库层面

    • 确保数据库连接时设置正确的字符集,如MySQL中的useUnicode=true&characterEncoding=utf8
    • 数据库表结构本身也需设置为合适的字符集。
  2. 文件操作

    • 使用Java的InputStreamReaderOutputStreamWriter时,传入正确的字符集名称。
  3. 系统环境设置

    • 检查并调整服务器、操作系统和IDE等相关软件工具的全局或局部字符集设置。

解决乱码问题的关键在于理解整个数据流程中各个阶段的字符集处理,并确保它们保持一致。对于现代Web开发,推荐使用UTF-8作为通用字符集,以最大程度减少跨平台和国际化场景下的乱码问题。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐