前言
在和前同事聊天的时候,他因为在接入翻译,所以问了我一个问题,关于在聊天中加入了表情的翻译处理。这个问题的点在哪里呢?是因为我们一般做聊天表情包的时候,绝大多数的处理都是加入一个特殊字符表示表情的起始关键字符,然后通过一个特殊的规则来匹配表情。但是在翻译的时候,很有可能会把这个表情给翻译成一个单词。通过他的讲解,我发现了其实通过一个小处理就能完美的解决掉它。
正文
转义字符
在接触字符的时候,我们肯定知道字符里有个特殊的字符,它叫转义字符。在ASCII码都可以用“\”加数字来标识的,那这个特殊字符就是“\”。它的含义就是用它来做一个关键字,然后它和后接的数字来表示一个特殊的含义。通过“\”这个字符把它后接的字符的含义给改变了。我们就可以通过定义一个特殊的字符来表示我们的表情。可能会有人问了,这个不就是一个简单的关键字标识嘛,有啥好讲的。
特定环境出现的问题
那后面我就讲一个特殊的环境。如果我们定义\1代表的是一个笑脸。我们在输入的时候,肯定是玩家选择了一个笑脸然后在发给服务器的时候,我们把笑脸替换成\1来发送的,这个是一个简单的表情发送,但是如果玩家输入了一个\1怎么办呢?是不是我们还把它翻译成笑脸呢?微信里就是这样处理的,你发送一个特殊格式的字符它就给你转换成特定的表情了。那如果我们在游戏里表情是到达一个等级或者一个条件开放的。那玩家是不是就这样卡了一个bug。那我们就思考下怎么处理吧。
一种简单的处理
其实处理起来很简单的。我们在玩家输入的"\"之前在加入一个"\"。那玩家在输入的时候就变成了“\1”那我们在做处理的时候,通过"\"后接"\"就翻译成反斜杠的特殊含义,我们就把这个当一个正常的"\"输出,最后在另外一端看到的玩家输出就是"\1"了。这样的处理就正常表示了玩家的输入。
测试代码
static void zhuanyi(string str,List<string> strs)
{
if (string.IsNullOrEmpty(str))
{
return;
}
int index = str.IndexOf('a');
if (index < 0)
{
strs.Add(str);
return;
}
strs.Add(str.Substring(0,index+2));
zhuanyi(str.Substring(index+2), strs);
}
static string zhuanyi1(List<string> strs)
{
string str = "";
for(int i = 0; i < strs.Count; i++)
{
int index = strs[i].IndexOf('a');
if (index > 0)
{
str += strs[i].Substring(0, index);
string temp = strs[i].Substring(index + 1);
if(temp == "1")
{
str += "哈哈";
}
else
{
str += temp;
}
}
else
{
string temp = strs[i].Substring(index + 1);
if (temp == "1")
{
str += "哈哈";
}
else
{
str += temp;
}
}
}
return str;
}
这就是一个简单的实现,没有优化过
结束
其实这个的处理是一个很简单的转义字符的特殊应用,我们可以在聊天呀,邮件呀,或者一些需要在文字里插入一些特殊含义内容的字符串里的应用。很多时候我们一些知道的知识点在应用的时候想不到。其实很大的一部分是我们只是把概念当成了概念,而没有转换成我们的智慧。