Unicode编码——微信翻译暗号

Unicode编码——微信翻译暗号

背景

以前在各种平台上经常看到有人介绍所谓的“微信翻译暗号”,这样的一串字符:

看起来让人摸不着头脑,但是长按选择翻译之后却有惊喜:

由于这些文章选择的句子大多是“我爱你”“我喜欢你”之类,又用诸如“表白神器”“微信暗号”的噱头来宣传,导致我一直以为这是微信翻译团队设置的小彩蛋,仅对特定的代码触发,也没有多想。

但是,后来我发现,事情远没有这么简单……

原理

直到我在学Python的时候看到用Unicode编码表示的中文:

1
2
>>> '\u4f60\u597d'
'你好'

很眼熟。

这样就基本可以断定,上面提到的所谓“微信翻译暗号”其实就是十六进制的Unicode编码,翻译之后就显示为原来的字符。

造轮子

于是我兴冲冲用Python写了一个生成程序:

1
2
3
4
5
6
s=input('输入需要转换的字符串:\n')
o=''
for i in s:
	o=o+'\\u'+str(hex(ord(i)))[2:]
	# python 内部就是用Unicode表示字符串,所以这里直接转成十六进制再加上前缀
print(o)

代码很简单。

但是发现输入ASCII字符的时候,生成的十六进制只有两位数(ASCII只用一个字节)形如“\u20”,翻译出来会是一堆乱码。

实践后发现补零有一定几率会解决问题,尤其在总字符较多的时候。

于是又写了补零的版本:

1
2
3
4
5
6
7
8
9
s=input('输入需要转换的字符串:\n')
o=''
for i in s:
	t=str(hex(ord(i)))[2:]
	if len(t)<=2:
		t='00'+t
	o=o+'\\u'+t
	# python 内部就是用Unicode表示字符串,所以这里直接转成十六进制再加上前缀
print(o)

换轮子

如果想让别人也用的话最好能够呈现在网页上,所以我又写了个JavaScript版的:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
function trans(s)
{
	var ans='';
	for(var i=0;i<s.length;++i)
    {
		var code=s.charCodeAt(i);
		var tmp=code.toString(16);
		if(code<=255)
			tmp='00'+tmp;
      ans+='\\u'+tmp;
    }
	return ans;
}

可以在这里体验哦:传送门

挖坑

点击翻译之后,下方的标签有以下几种可能:

“微信翻译”,“微软翻译”,“已翻译”,“完成翻译”……

推测微信会根据内容选择合适的引擎,

但是目前来看只有微软翻译在含有ASCII字符的情况下输出正确的结果。可以直接在这里试:微软翻译

(╯‵□′)╯︵┻━┻

结论

还是全部打中文比较好。

0%