默认字符集编码:Charset.defaultCharset()


经典参考文章
Charset.defaultCharset()和file.encoding的关系


一切存储在硬盘上的数据都是二进制数据,而IO流从硬盘读取到内存中的数据都存储在byte数组中,byte字节数组需要按照对应的编码规则才能解码为正确的字符串、图片等对象。

Charset的defaultCharset方法实现

从Charset的defaultCharset方法源码我们可以看到,默认字符集是最终通过System.getProperty(“file.encoding”)方法来获取的。

  • 当JVM启动时,通过JVM参数-Dfile.encoding=XXX指定了编码格式,以此编码格式为准。但如果XXX是不支持的字符集,则默认使用UTF-8编码
  • 当JVM启动时,没有指定JVM参数-Dfile.encoding,则以JVM所在操作系统的默认字符集为准。
    注意:在Windows的DOS窗口输入:chcp,显示983,则表示是GBK
 public static Charset defaultCharset() {
       if (defaultCharset == null) {
           synchronized (Charset.class) {
               String csn = AccessController.doPrivileged(
                   new GetPropertyAction("file.encoding"));
               Charset cs = lookup(csn);
               if (cs != null)
                   defaultCharset = cs;
               else
                   defaultCharset = forName("UTF-8");
           }
       }
       return defaultCharset;
}

public String run() {
     String var1 = System.getProperty(this.theProp);
     return var1 == null ? this.defaultVal : var1;
}

如何将byte数组通过指定编码方式转换为字符串

String的getBytes()方法和String(byte bytes[])构造方法默认使用Charset.defaultCharset()来获取编码字符集,当然我们也可以手动指定编码方式

byte[] b = "中国".getBytes();
System.out.println(new String(b, "GBK"));//涓浗
System.out.println(new String(b, StandardCharsets.UTF_8)); //中国

byte[] b1 = "中国".getBytes("GBK");
System.out.println(new String(b1, "GBK"));//中国
System.out.println(new String(b1, StandardCharsets.UTF_8)); //�й�
class String{
	public String(byte bytes[], int offset, int length) {
	   checkBounds(bytes, offset, length);
	   this.value = StringCoding.decode(bytes, offset, length);
	}
}

# StringCoding.decode方法的定义
static char[] decode(byte[] ba, int off, int len) {
	String csn = Charset.defaultCharset().name();
	try {
	    // use charset name decode() variant which provides caching.
	    return decode(csn, ba, off, len);
	} catch (UnsupportedEncodingException x) {
	    warnUnsupportedCharset(csn);
}

转换流InputStreamReader和OutStreamWriter使用了Charset.defaultCharset()方法

InputStreamReader 将字节输入流转换为字符流,而OutStreamWriter将字符流转换为字节输出流

public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("C:\\Users\\admin\\Desktop\\test.txt");
        InputStreamReader isr = new InputStreamReader(fis);
        //InputStreamReader isr2 = new InputStreamReader(fis, StandardCharsets.UTF_8);
        FileOutputStream fos = new FileOutputStream("C:\\Users\\admin\\Desktop\\1.txt");
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        //OutputStreamWriter osw2 = new OutputStreamWriter(fos, StandardCharsets.UTF_8);

        char[] chars = new char[1];
        int len;
        while ((len = isr.read(chars))!= -1) {
            osw.write(chars, 0, len);
            osw.flush();
        }
        isr.close();
        osw.close();
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
建立表的SQL批处理代码如下: 1.用户表: CREATE TABLE `user` ( `Id` int(11) NOT NULL auto_increment, `name` varchar(16) NOT NULL default '无名老饕', `password` varchar(16) NOT NULL default '', `power` int(2) NOT NULL default '0', `image` varchar(100) default 'D:\\Code_Maker\\eclipse9.0\\test\\WebRoot\\images\\TX.gif' COMMENT '头像', `mail` varchar(255) default NULL, `sex` varchar(255) NOT NULL default '', `flag` varchar(5) NOT NULL default 'false' COMMENT 'false代表该用户未登陆', PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; 2.新闻表: CREATE TABLE `news` ( `Id` int(11) NOT NULL auto_increment, `title` varchar(160) character set utf8 NOT NULL default '', `content` mediumtext character set utf8 NOT NULL, `clicktime` int(11) default '0', `image` varchar(250) character set utf8 NOT NULL default '', `type` varchar(100) character set utf8 NOT NULL default '', PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_bin COMMENT='信息'; 3.主题帖表: CREATE TABLE `tiezi` ( `Id` int(11) NOT NULL auto_increment, `topic` varchar(255) NOT NULL default '' COMMENT '帖子的主题', `uid` int(11) NOT NULL default '0' COMMENT '发帖人ID号', `content` mediumtext NOT NULL COMMENT '帖子的大体内容', `time` datetime NOT NULL default '0000-00-00 00:00:00', `clicktime` int(11) NOT NULL default '0', PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='主动发帖的(区别)于评论'; 4.评论表: CREATE TABLE `commentary` ( `Id` int(11) NOT NULL auto_increment, `nid` int(11) NOT NULL default '0' COMMENT '对应帖子编号', `uid` int(11) NOT NULL default '0' COMMENT '对应评论者编号', `content` mediumtext character set utf8 NOT NULL COMMENT '评论的内容', `time` datetime NOT NULL default '0000-00-00 00:00:00' COMMENT '评论时间', PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk COLLATE=gbk_bin COMMENT='评论'; 5.投票表: CREATE TABLE `vote` ( `Id` int(11) NOT NULL auto_increment, `type` int(11) NOT NULL default '0', `topicid` int(11) NOT NULL default '0', `title` varchar(255) NOT NULL default '', `result` int(11) NOT NULL default '0', `ip` text NOT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 数据库部分如上,我就不传脚本了,上学期做的课程设计,话说这个学期学java EE 又做了系统,代码姐姐我全包办了。。。哎~以前打酱油,现在没人让我打了,要自己写了~不过动手能力有加强,理解深入了!特别是java EE,纯粹自学了,上课看考研书去了。。。加油!!!
【毕设源码】基于SSM搭建的客户管理系统 SSM 客户管理系统 采用的主要框架为:Spring + SpringMVC + Mybatis + Bootstrap。 SSM 客户管理系统是基于 SSM 搭建的客户管理系统,其中为了便于新手学习,采用了jsp页面,bootstrap作为基础,pagehelp作为分页插件,这样能使大家更容易的掌握。 依赖 依赖 版本 Spring 5.0.2.RELEASE Spring MVC 5.0.2.RELEASE Mybatis 3.4.5 PageHelp 分页插件 5.1.4 Druid 数据源 1.1.16 Lombok 插件 1.18.8 Mybatis 逆向工程 1.3.7 表设计 用户表 这里为了简洁,用户模块只设计了账号和密码,主要用于登录,当然,你可以多增加一些属性,作为后期的用户信息的维护。 CREATE TABLE `tb_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 客户表 相关的客户信息,同样的可以自己增加,这里我就不再阐述。 CREATE TABLE `tb_customer` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `phone` varchar(255) DEFAULT NULL, `email` varchar(255) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8; 插件 逆向工程 用于快速生成开发中不断重复的代码,比如说实体类,映射层接口,以及Mybatis XML文件的编写,只需要提供数据库连接的jar地址,数据库名称,账号密码即可一键生成:实体类,Mapper接口,Mapper映射文件。
rbac数据库设计 1 rbac数据库设计 RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中⼼进⾏访问控制分享⽜原创,分享⽜系列,分享⽜。rbac ⽤户⾓⾊权限资源表如 何设计呢?下⾯开始表的设计。RBAC表结构。 1.1 ⽤户表 CREATE TABLE `sys_user` ( `id` varchar(36) NOT NULL COMMENT '主键', `usercode` varchar(32) NOT NULL COMMENT '账号', `username` varchar(64) NOT NULL COMMENT '姓名', `password` varchar(32) NOT NULL COMMENT '密码', `salt` varchar(64) DEFAULT NULL COMMENT '盐', `locked` char(1) DEFAULT NULL COMMENT '账号是否锁定,1:锁定,0未锁定', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.2 ⾓⾊表 CREATE TABLE `sys_role` ( `id` varchar(36) NOT NULL, `name` varchar(128) NOT NULL, `available` char(1) DEFAULT NULL COMMENT '是否可⽤,1:可⽤,0不可⽤', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.3 ⽤户⾓⾊中间表 CREATE TABLE `sys_user_role` ( `id` varchar(36) NOT NULL, `sys_user_id` varchar(32) NOT NULL, `sys_role_id` varchar(32) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.4 权限表 CREATE TABLE `sys_permission` ( `id` bigint(20) NOT NULL COMMENT '主键', `name` varchar(128) NOT NULL COMMENT '资源名称', `type` varchar(32) NOT NULL COMMENT '资源类型:menu,button,', `url` varchar(128) DEFAULT NULL COMMENT '访问url地址', `percode` varchar(128) DEFAULT NULL COMMENT '权限代码字符串', `parentid` bigint(20) DEFAULT NULL COMMENT '⽗结点id', `parentids` varchar(128) DEFAULT NULL COMMENT '⽗结点id列表串', `sortstring` varchar(128) DEFAULT NULL COMMENT '排序号', `available` char(1) DEFAULT NULL COMMENT '是否可⽤,1:可⽤,0不可⽤', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.5 ⾓⾊权限表 CREATE TABLE `sys_role_permission` ( `id` varchar(36) NOT NULL, `sys_role_id` varchar(32) NOT NULL COMMENT '⾓⾊id', `sys_permission_id` varchar(32) NOT NULL COMMENT '权限id', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 1.6 初始化数据 /* SQLyog v10.2 MySQL - 5.1.72-community : Database - shiro ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值