编码_解码那些事,android程序开发大作业

发现bug之后,我开始思考对密文进行编码,一开始使用了URLEncoder.encode("****","utf-8")这种方式来进行编码,但是编码之后发现编码之后的密文和编码之前的密文完全一致。和同事聊了一下这个现象,猜测是javascript编码方式不一致。于是我开始探索web端使用的编码方式——escape

escape函数

JavaScript escape() 函数

该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 。其他所有的字符都会被转义序列替换。

可以使用 unescape() 对 escape() 编码的字符串进行解码。

当我试图从网上寻找Java版本的escape函数时,看见一种思路:

image.png

  • 将数字、大小写的字母不进行处理
  • 对每个非汉字的特殊符号(ASCII值小于256)前增加%,然后将该符号转ASCII值,并且以十六进制展示。
  • 对每个中文前增加%u,然后对该文字转ASCII值,并且以十六进制展示。如将“中”转为%u4E2D

这种思路和上面文档的定义严重违背,不符合上面文
档的说明,测试失败。

继续翻,发现网上有一个java版本的Escape工具类出现频率很高。根据懒人原则第一条,复制代码到项目,测试是否可用。准备关闭项目摸鱼的时候发现一个问题.先卖个关子,看看这个方法和上面方法的区别:

  • 将数字、大小写的字母以及['-','_','.','!','~','*','/','(',')']数组内的特殊字符不处理
  • 将空格转为+
  • 对每个非汉字的特殊符号(ASCII值小于128)前增加%,然后将该符号转ASCII值,并且以十六进制展示。如转为%A5
  • 对每个中文前增加%u,然后对该文字转ASCII值,并且以十六进制展示。如将“中”转为%u4E2D

扫了一眼,发现这个方法和定义不对,定义里面只有7种特殊符号,也没有对空格和+号做阐述,于是测试了一波,发现果然还是坑:

escape(" “) // 运行结果:”%20"

于是再次修改,这次只根据JavaScript escape() 函数定义来编辑,得到如下代码:

private fun escape(src: String): String {
var i = 0
var j: Char
val tmp = StringBuffer()
tmp.ensureCapacity(src.length * 6)
while (i < src.length) {
j = src[i]
when {
Character.isDigit(j)
|| Character.isLowerCase(j)
|| Character.isUpperCase(j)
|| specialSymbols.contains(j) -> tmp.append(j)
j.toInt() < 128 -> {
tmp.append("%")
if (j.toInt() < 16) tmp.append(“0”)
tmp.append(j.toInt().toString(16))
}
else -> {
tmp.append("%u")
tmp.append(j.toInt().toString(16))
}
}
i++
}
return tmp.toString()
}

既然有编码,那肯定得有对应的解码方法,这个也很简单:

fun unescape(src: String): String {
val tmp = StringBuffer()
tmp.ensureCapacity(src.length)
var lastPos = 0
var pos = 0
var ch: Char
while (lastPos < src.length) {
pos = src.indexOf("%", lastPos)
if (pos == lastPos) {
when {
src[pos + 1] == ‘u’ -> {
ch = src
.substring(pos + 2, pos + 6).toInt(16).toChar()
tmp.append(ch)
lastPos = pos + 6
}
else -> {
ch = src
.substring(pos + 1, pos + 3).toInt(16).toChar()
tmp.append(ch)
lastPos = pos + 3
}
}
} else {
lastPos = if (pos == -1) {
tmp.append(src.substring(lastPos))
src.length
} else {
tmp.append(src.substring(lastPos, pos))
pos
}
}
}
return tmp.toString()
}

三、反思

照理来说,这个时候应该可以摸鱼了,但是有一个疑问深深的困惑着我,为什么解码/编码没有统一的方法?难道真的存在javajavascript编码不一致吗?于是我打开了URLEncoder.encode源码:

/**

  • Translates a string into {@code application/x-www-form-urlencoded}
  • format using a specific encoding scheme. This method uses the
  • supplied encoding scheme to obtain the bytes for unsafe
  • characters.
  • Note: The <a href=
  • “http://www.w3.org/TR/html40/appendix/notes.html#non-ascii-chars”>
  • World Wide Web Consortium Recommendation states that
  • UTF-8 should be used. Not doing so may introduce
  • incompatibilities.
  • @param s {@code String} to be translated.
  • @param enc The name of a supported
  • character
  • encoding.
  • @return the translated {@code String}.
  • @exception UnsupportedEncodingException
  •         If the named encoding is not supported
    
  • @see URLDecoder#decode(java.lang.String, java.lang.String)
  • @since 1.4
    */
    public static String encode(String s, String enc)
    throws UnsupportedEncodingException {

boolean needToChange = false;
StringBuffer out = new StringBuffer(s.length());
Charset charset;
CharArrayWriter charArrayWriter = new CharArrayWriter();

if (enc == null)
throw new NullPointerException(“charsetName”);

try {
charset = Charset.forName(enc);
} catch (IllegalCharsetNameException e) {
throw new UnsupportedEncodingException(enc);
} catch (UnsupportedCharsetException e) {
throw new UnsupportedEncodingException(enc);
}

for (int i = 0; i < s.length()😉 {
int c = (int) s.charAt(i);
//System.out.println("Examining character: " + c);
if (dontNeedEncoding.get©) {
if (c == ’ ') {
c = ‘+’;
needToChange = true;
t c = (int) s.charAt(i);
//System.out.println("Examining character: " + c);
if (dontNeedEncoding.get©) {
if (c == ’ ') {
c = ‘+’;
needToChange = true;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
android开发期末大作业(项目源码,任务书,实验大报告,apk文件) 大作业的要求和内容:(包括题目选择范围、技术要求、递交时间、考核方法等) 一、实验项目名称 Android手机应用开发课程大作业 二、实验目的 1.通过本课程设计的实践及其前后的准备与总结,复习、领会、巩固和运用课堂上所学的Android手机应用开发知识。 2.为学生综合应用本专业所学习的多门课程知识(例如,软件工程、数据库、Java语言、Java Web开发等)创造实践机会。为学生提供主动学习、积极探索与大胆创新的机会。 3.掌握Android手机应用设计的方法与技巧。 三、实验内容及要求 1、设计内容 题目、设计内容自拟,工作量适中,要求学生应用课程所学知识,采用JAVA语言和Android手机应用开发技术实现一个完整的系统。 ①完成大作业报告。 ②实现各系统功能,并完成调试运行。 2、主要技术 采用Java语言并不仅限于Java语言实现系统。 开发环境与工具:Android Studio 3.2以上版本; 操作系统:Win7/Win10或其他; 4、设计成果: 材料上交:电子文档(大作业任务书+大作业报告+源代码,电子稿请刻在光盘上)、打印稿(大作业任务书+大作业报告)。 四、成绩评定: 考核标准包括: 1、选题的工作量,难度和新颖程度 2、系统架构设计是否良好,运行过程是否报错 3、界面设计的合理性和美观程度 4、基本功能的实现 分值60 (包括布局、组件、Activity、Intent等使用) 数据存储的使用 分值10 网络功能 分值10 Service、ContentProvider或BroadCastReceiver等的使用 分值10 附加分: 图形图像处理、多媒体处理等 分值10 5、考核方式为面对面答辩,在课程的后两周内集中进行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值