前言
这已经是好几年以前的小玩意了,今天闲着无聊翻翻相册,无意看到的,因此写下了这篇。
正文
Unicode编码
先来介绍一下Unicode编码吧
它为了使计算机实现跨语言、跨平台的文本转换及处理而产生的业界标准。
控制字符
控制字符,顾名思义,它是出现于特定的信息文本中,表示某一控制功能的字符。
而关于qq群名片小尾巴生成,主要用到以下两个Unicode控制字符
&# 8237;LRO 开始从左向右覆盖
&# 8238;RLO开始从右向左覆盖
大多数语言都是从左向右读的,不过还真有从右向左读的语言,所以就出现了RLO(Right-to-Left Override),另外RLO在渗透方面也有应用(RLO文件名欺骗)
如果某些网站和谐某些关键字如“xyz”,你可以这样写"RLO字符+zyx",这样效果就是“xyz”。同理,在qq中,小明撤回了一条消息,如果把小明的群昵称改成“RLO字符+小明”,那么就会显示“息消条一了回撤明小”,那么如何做到”小明撤回了一条消息并打了你一下”的效果呢?
我们一步一步分析:
- 程序先得到用户的nickname
- 再拼接“撤回了一条消息”
- 输出顺序是nickname + “撤回了一条消息”
我们把nickname中加入RLO字符和tail(下一你了打并)以及LRO字符
- 程序得到nickname
- 拼接“撤回了一条消息”
- 先输出nickname
小明/
- 到RLO字符时,从右向左输出
- 从右向左输出tail
小明/并打了你一下
此时最后一次输出后的位置(即’/’)在“小明”与“并打了你一下之间” - 到LRO字符时,从左向右输出
- 输出拼接字符
小明撤回了一条消息/并打了你一下
这样就可以显示小明撤回了一条消息并打了你一下的效果了
代码
原理有了,实践开始
Button btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
EditText nn=(EditText)findViewById(R.id.name);
EditText tl=(EditText)findViewById(R.id.tail);
String name=nn.getText().toString();
String tail=tl.getText().toString();
if (name.length()==0 || tail.length()==0){
Toast.makeText(getApplicationContext(),"Please input your nick name and tail!",Toast.LENGTH_LONG).show();
return;
}
String s=name+(char)8238+reverse(tail)+(char)8237;
ClipboardManager cm=(ClipboardManager)getSystemService(Context.CLIPBOARD_SERVICE);
ClipData cd=ClipData.newPlainText(null,s);
cm.setPrimaryClip(cd);
Toast.makeText(getApplicationContext(),"Copied",Toast.LENGTH_LONG).show();
}
public String reverse(String str){
return new StringBuffer(str).reverse().toString();
}
});
效果:
源码请访问Github:Click me