这已经是好几年以前的小玩意了,今天闲着无聊翻翻相册,无意看到的,因此写下了这篇。
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