x 开头编码的数据解码成中文
在python里,直接decode('utf-8')即可
>>> "xE5x85x84xE5xBCx9FxE9x9AxBExE5xBDx93 xE6x9Dx9CxE6xADx8C".decode('utf-8') u'u5144u5f1fu96beu5f53 u675cu6b4c' >>> print "xE5x85x84xE5xBCx9FxE9x9AxBExE5xBDx93 xE6x9Dx9CxE6xADx8C".decode('utf-8') 兄弟难当 杜歌 >>>
在java里未发现直接解码的函数,不过只要理解了数据是如何编码的,就可以很快的进行解码,推荐阅读http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
UTF-8是unicode编码的一种落地方案:
Unicode符号范围 | UTF-8编码方式 (十六进制) | (二进制) --------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
x对应的是UTF-8编码的数据,通过转化规则可以转换为Unicode编码,就能得到对应的汉字,转换规则很简单,先将x去掉,转换为数字,然后进行对应的位移操作即可,需要注意的是先要判断utf-8的位数:
val pattern = """(d+.d+.d+.d+) - (S+) (S+) [([^]]+)] "(w+) (S+) S+" (S+) (S+) "([^"]+)" "([^"]+)" "([^"]+)" "([^"]+)""".r
val decodeDataPattern = """(\x([0-9A-Z]){2})+""".r
def decodeUtf8(utf8Str:String):String={
var data = decodeDataPattern.replaceAllIn(utf8Str, m=>{
var item = decodeXdata(m.toString())
item
})
return data
}
def decodeXdata(utf8Str:String):String={
var arr = utf8Str.split("\\x")
var result = new StringBuilder()
var isMatchEnd = true
var matchIndex = 0
var currentWordLength = 0
var current = 0
var e0=0xe0;
for(item <-arr){
var str = item.trim
if(str.length()>0){
var currentCode = Integer.parseInt(str, 16);
if(isMatchEnd){
isMatchEnd = false
var and = currentCode & e0;
if(and == 0xe0){
matchIndex = 1;
currentWordLength = 3;
current = (currentCode & 0x1f) <<12 // 3位编码的
}else if(and==96){
matchIndex = 1;
currentWordLength = 2;
current = (currentCode & 0x1f) <<6 // 2位编码的
}else{
current = currentCode // 1位编码的
}
}else{
matchIndex = matchIndex+1;
if(matchIndex == 2)
{
current+=(currentCode & 0x3f) <<6
}else{
current+=(currentCode & 0x3f)
}
}
if(matchIndex==currentWordLength){
var hex = Integer.toHexString(current)
hex = if(hex.length()<4) "\u00"+hex else "\u"+hex //补0
result.append(new String(StringEscapeUtils.unescapeJava(hex).getBytes,"utf-8"))
current = 0
matchIndex=0
isMatchEnd = true
}
}
}
return result.toString()
}
- spring boot 登录注册 demo (四) -- 体验小结
- jenkins 时区设置
- 什么样的密码才是安全的?
- MAC本遭遇ARP攻击的处理办法
- nodejs 语法学习(持续更新)
- Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)
- - Templates should only be responsible for mapping the state to the UI. Avoid placing tags with side
- Django - - - -视图层之视图函数(views)
- fiddler mock ==> AutoResponder
- 基于Node.js开发跨平台窗口程序
- Django视图层之路由配置系统(urls)
- java String时间转为时间戳
- linux 简易启动脚本
- 2017年我国大数据产业发展五大新突破
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Scss (Sass) 语法简介
- 如何写一个简单的node.js c++扩展
- 给 c# 程序员的十个重要提示
- 子序列问题
- Spark实现推荐系统中的相似度算法
- iOS 中的 CFBundleShortVersionString 与 CFBundleVersion
- 买卖股票问题合集
- 服务出错优先考虑及排查手册(待续整理)
- Android 沉浸式全屏
- Spark SQL 小文件问题处理
- vue常用的修饰符有哪些?
- 在 ASP.NET WebAPI 中使用 DataAnnotations 验证数据
- CSS简笔画:纯CSS绘制一艘邮轮
- NHibernate 多对多映射的数据更新
- 使用 AngularJS 的 $resource 连接 WebAPI Controller