在文本字段中使用Android的原生微笑时出错(Unity3d)

时间:2015-05-12 06:50:03

标签: android unity3d

我使用res.set('Content-Type', 'text/csv'); var toCsv = require('to-csv'); // obj is a just a standard JavaScript object. res.send(toCsv(obj)); 创建应用程序并为Unity3d构建它,当我在输入字段中写入android native smiles时 - 我遇到了错误

Android

chars包含(invalid utf-16 sequence at 1411555520 (missing surrogate tail)): r.font.RequestCharactersInTexture(chars, size, style); ,而不是包含原生的android微笑。我怎么能支持原生的微笑?我为输入字段使用自己的类。

1 个答案:

答案 0 :(得分:1)

不幸的是,使用Unity支持表情符号很难。当我实现此功能时,花了大约一个月的时间来完成它,使用自定义文本布局引擎和字符串类。所以,如果这个要求不是特别重要,我会建议削减这个功能。

这个特殊错误背后的原因是Unity逐个从输入字符串中获取字符,并更新每个字符的可视字符串。从外行人的角度来看,这是完全有道理的。但是,它没有考虑在C#中使用的UTF-16编码如何工作。

UTF-16编码每个unicode字符使用16位。对于您通常使用的几乎所有角色来说都足够了。 (并且,正如每个开发人员都知道的那样,“几乎所有”都是一个红旗,它将长时间处于休眠状态,然后会爆炸并摧毁你所爱的一切。)但事实恰巧,表情符号字符是<​​strong>不是< / strong>适合16位UTF-16字符,并使用特殊情况 - surrogate pair

A table with different characters in UTF8 and UTF16 representation

代理项对是UTF-16字符的,表示单个Unicode字符。这意味着它们本身没有任何意义,当你试图渲染一个代理头或代理尾的UTF-16字符时,你可能会得到这样的错误或类似的错误。 / p>

基本上,你需要实现的是某种缓冲区,它将逐个接受C#UTF-16字符,然后在验证所有代理项对被关闭时将它们传递给渲染代码。

哦,我差点忘了!某些表情符号字符(如国家/地区标志)由两个unicode字符表示。这意味着他们可能会占用四个UTF-16字符。文字编码不是很有趣吗?