八进制与中文之间的转换_八进制转中文在线_slowly_jin的博客-程序员宝宝

技术标签: java  

学习目标:

八进制字符与中文之间的转换


学习内容:

直接上代码:

package com.lof.utils;

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;

/**
 */
public class OctalUtils {
    

    /**
     * 八进制转中文
     * @param dataStr 八进制字符
     * @return
     */
    public static String transfromOctalToString(String dataStr) {
    
        if (! dataStr.contains("\\")) {
    
            return dataStr;
        }
        //不属于八进制内容的字符
        StringBuilder oldBuffer = new StringBuilder();
        //属于八进制的内容,转成十六进制后缓存在这里
        StringBuilder hexBuffer = new StringBuilder();
        for (int i = 0; i < dataStr.length(); i ++) {
    
            char c = dataStr.charAt(i);
            if (c != '\\') {
    
                oldBuffer.append(c);
            }
            //反斜杠往后3个为一组,组成了一个八进制数。例如\20710,其实是207组成了一个八进制数
            else {
    
                char c1 = dataStr.charAt(i + 1);
                char c2 = dataStr.charAt(i + 2);
                char c3 = dataStr.charAt(i + 3);
                i += 3;
                //将八进制转换为十进制,再转换为十六进制
                String hex = Integer.toHexString((Integer.valueOf("" + c1 + c2 + c3, 8)));
                //先缓存住,直到凑够三个字节
                hexBuffer.append(hex);
                String hexString = hexBuffer.toString();
                //utf8编码中,三个字节为一个汉字
                if (hexString.length() == 6) {
    
                    //凑够三个字节了,转成汉字后放入oldBuffer中
                    oldBuffer.append(hexStr2Str(hexString));
                    //凑够一个汉字了,清空缓存
                    hexBuffer = new StringBuilder();
                }
            }
        }
        return oldBuffer.toString();
    }
    /**
     * 十六进制转换字符串
     */
    private static String hexStr2Str(String hexStr) {
    
        String str = "0123456789abcdef";
        char[] hexs = hexStr.toCharArray();
        byte[] bytes = new byte[hexStr.length() / 2];
        int n;
        for (int i = 0; i < bytes.length; i++) {
    
            n = str.indexOf(hexs[2 * i]) * 16;
            n += str.indexOf(hexs[2 * i + 1]);
            bytes[i] = (byte) (n & 0xff);
        }
        return new String(bytes, StandardCharsets.UTF_8);
    }

    /**
     * 中文转八进制字符
     * @param s
     * @return
     */
    public static String toOct(String s)
    {
    
        String result = "";
        byte[] bytes = s.getBytes();
        for (byte b : bytes)
        {
    
            int b1 = b;
            if (b1 < 0) {
    
                b1 = 256 + b1;
            }
            result += "\\" + (b1 / 64) % 8 +  "" + (b1 / 8) % 8 + "" + b1 % 8;
        }
        return result;
    }

    /**
     * 八进制字符转中文
     *  只转换并显示属于八进制的字符(\\xxx形式)
     * @param s
     * @return
     */
    public static String getOct(String s) {
    
        String[] as = s.split("\\\\");
        byte[] arr = new byte[as.length - 1];
        for (int i = 1; i < as.length; i++)
        {
    
            int sum = 0;
            int base = 64;
            for (char c : as[i].toCharArray())
            {
    
                sum += base * ((int)c - '0');
                base /= 8;
            }
            if (sum >= 128) {
    
                sum = sum - 256;
            }
            arr[i - 1] = (byte)sum;
        }
        String getOctStr = null;
        try {
    
            getOctStr = new String(arr, "UTF-8");
        } catch (UnsupportedEncodingException e) {
    
            e.printStackTrace();
        }
        return getOctStr; //如果还有乱码,这里编码方式你可以修改下,比如试试看unicode gbk等等
    }


    public static void main(String[] args) {
    
        //weihushijian5xiaoshi
        String s = "\\347\\273\\264\\346\\212\\244\\346\\227\\266\\351\\227\\264" +
                "5\\345\\260\\217\\346\\227\\266";//维护时间5小时
        System.out.println("transfromOctalToString(s) = " + transfromOctalToString(s));//transfromOctalToString(s) = 维护时间5小时
        System.out.println("getOct(s) = " + getOct(s));//getOct(s) = 维护时间小时
        System.out.println("toOct(\"小时\") = " + toOct("小时"));//toOct("维护") = \345\260\217\346\227\266
    }
}

转换的原理(待了解)


学习时间:

2021-08-04


总结

附:学习记录,方便查看

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43223477/article/details/119390530

智能推荐

js 多维数组遍历并赋值_js多维数组赋值_周家大小姐.的博客-程序员宝宝

let data = [{ "Id": 1, "RegionName": "中国", "Child": [{ "Id": 2, "RegionName": "北京市", "Child": [{ "Id": 3, ...

有限元法的学习(一)_影随风不动的博客-程序员宝宝

CST单元-有限元法理论与编程实现有限元法的思想有限元法作是一种数值计算的方法,是一种近似解的求解方式。首先,我们面对的问题通常是这样的一种问题,在对象的微元体中做分析,依据一些物理规律或者力学原理会得出相应的关系式,这种关系式一般会有两种情况,一是得出一个偏微分方程,即研究PDE在边界条件下的解答,也就是边值问题;二是得出一个泛函表达式,在边界条件下去研究问题的极值问题。因此,对于实...

关于Oracle 01122,01110,01207的错误和解决_weixin_33724659的博客-程序员宝宝

windows xp,数据库oracle 10.2.0。1没有备份,基本上是默认安装,好像还不是归档模式症状:sqlplus只有sysdba用户能进去,其他用户进去一概报:ora-01033:oracle正在初始化或关闭而且sysdba用户进去之后能执行select sysdate from dual,但是执行select usernam from...

使用边界值分析法与判定表驱动法设计测试用例,测试nextDate函数_南隅笙箫的博客-程序员宝宝

需求日期问题测试以下程序:该程序有三个输入变量 month、day、year (month、day 和 year 均为整数值,并且满足:1 ≤ months ≤ 12、1 ≤ days ≤ 31 和 1900 ≤ year ≤ 2050),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上隔天的日期。例如,输入为 2004 年 11 月 30 日,则该程序的输出为 2004 年 12 月 1 日。(1) 边界值分析法设计测试用例;(2) 判定表驱动法设计测试用例。实现一、边界值

Windows10 下安装 Rational Rose 2007 图文教程_i与君共勉的博客-程序员宝宝

这里写自定义目录标题引言参考博客Rational Rose介绍引言因软件工程课程需要,此教程带来软件建模工具Rational Rose 2007安装破解教程,经探索整理,与大家共勉参考博客参考博客: https://blog.csdn.net/zml_2015/article/details/50807150.Rational Rose介绍Rational Rose是Rational公...

第六章——Grid命令_weixin_34365417的博客-程序员宝宝

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

随便推点

数据结构:顺序栈与链栈_链栈注意事项_WEIv.的博客-程序员宝宝

栈(stack):概念:栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。栈是允许在同一端进行插入和删除操作的

Android 经典笔记七:CountDownTimer解读_countdowntimer timer2 = new countdowntimer(3000050_杨充的博客-程序员宝宝

目录介绍CountDownTimer(倒计时计数器) - 1.1 介绍 - 1.2 参数 - 1.3 公共方法 - 1.4 使用方法 - 1.5 源码分析 - 1.6 synchronized 关键字0.本人写的综合案例 案例 说明及截图 模块:新闻,音乐,视频,图片,唐诗宋词,快递,天气,记事本,阅读器等等 接口:七牛,阿里云,天行,干货集中营,极速数据,追书神器等等1.1介绍

beego orm 使用案例单表 多表CRUD_FoxCaox的博客-程序员宝宝

beego orm使用初始化创建新beego项目bee new test在main.go中开始测试模型关系外键始终在子表上#一个用户对应一个简介;一个简介对应一个用户;one2one:User(子表) -&gt; Profile(主表);one2one:Profile -&gt; User#一个邮件对应一个用户;一个用户有多个邮件;one2many:Post(子表) -&gt;...

hdu2815 扩展Baby step,Giant step入门_9974的博客-程序员宝宝

题意:求满足a^x=b(mod n)的最小的整数x。分析:很多地方写到n是素数的时候可以用Baby step,Giant step, 其实研究过Baby step,Giant step算法以后,你会发现  它能解决    “n与a互质”的情况,而并不是单纯的n是素数的情况。如果a与n不是互质的,那么我们需要处理一下原方程,让a与n互质,然后再用Baby step,Giant step解出x

iview中的i-circle宽度自适应_krifyFan的博客-程序员宝宝

iview中的i-circle宽度自适应页面部分&amp;lt;i-circle :percent=maintenanceRateCount.nowYearOrderPercentage //控制大小 :size=circleWidth stroke-linecap=&quot;square&quot; stroke-color=&quot;#2562e9&quot; trail-color=&quot;#002251&quot;&amp;...

复习Android——ContentProvider_contentprovider查询did(设备did)的方式_秋名山山妖的博客-程序员宝宝

简介ContentProvider主要用于在不同的应用之间实现数据共享,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时保证数据的安全性。ContentProvider是Android实现跨程序数据共享的标准方式。运行时权限Android权限机制权限申请即在Manifest文件中引入&lt;uses-permission&gt;元素:&lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"

推荐文章

热门文章

相关标签