所以我从网络服务器得到这样的回应:
"\ud83d\ude48\ud83d\ude02\ud83d\ude30\ud83d\ude09\ud83d\udc4f\ud83c\udffd\ud83d\udc4c\ud83c\udffd\ud83d\udd1d\u2714\ufe0f\ud83d\ude42 \344\366\374\337\u015b\u0161"
解码后应如下所示:

🙈😂😰😉👏🏽👌🏽🔝✔️🙂äöüßśš

äöüß被编码为八进制文字\344\366\374\337
为了正确显示此消息(未编码的纯文本),我使用了:
{{ JSON.parse('"' + messageContent.message + '"') }}
而且它非常适合转义的unicode值,但是当出现八进制文字时,它不是,所以这是问题所在-ES6不允许使用八进制文字,因为它们已被弃用,并且会出现错误,所以我所做的只是发现用正则表达式表示八进制文字,然后使用:String.fromCharCode(parseInt(parseInt(val.replace('\\', ''), 8), 10))解析它们,以便从例如:\344中获取ä。替换八进制数后,我必须搜索任何unicode字符,然后再次使用JSON.parse(`"${val}"`)对其进行解析(这与下面所述的情况相同-如果我对字符串进行硬编码并仅返回\ud83d\ude48,则不必解析它使用JSON.parse,它只返回🙈)。我认为这不是最佳解决方案。

对我来说,另一个奇怪的事情是,当我尝试使用以下方法直接从服务器响应中显示消息时(即使它不包含任何八进制文字):{{ response.message }}它将作为普通字符串打印,但是当我创建新变量并分配与我从服务器收到的值完全相同的值时:
message='\ud83d\ude48\ud83d\ude02\ud83d\ude30\ud83d\ude09\ud83d\udc4f\ud83c\udffd\ud83d\udc4c\ud83c\udffd\ud83d\udd1d\u2714\ufe0f\ud83d\ude42'然后显示它
{{ message }}显示的值为🙈😂😰😉👏🏽👌🏽🔝✔️🙂。

最后一件事:即使使用算法,我有时仍在寻找与/\\[[a-zA-Z0-9]{1,5}\\[[a-zA-Z0-9]{1,5}/g匹配的文本,有时它无法很好地解析unicode-例如:如果用户更改了肤色,则unicode消息将为:\ud83d\udc4d\ud83c\udffd,已解码:👍🏽,但是用这个正则表达式将是👍�\udffd
如有必要,可以在后端进行一些小的更改,但已完成的移动应用程序也使用它,因此更改不会影响它们。

谢谢你的帮助。

最佳答案

尝试手动解码unicode转义序列(\uXXXX)和八进制转义序列(\XXX),如下所示:

const response = '\\ud83d\\ude48\\ud83d\\ude02\\ud83d\\ude30\\ud83d\\ude09\\ud83d\\udc4f\\ud83c\\udffd\\ud83d\\udc4c\\ud83c\\udffd\\ud83d\\udd1d\\u2714\\ufe0f\\ud83d\\ude42 \\344\\366\\374\\337\\u015b\\u0161'
const decoded = response
  .replace(/\\u(....)/g, (match, p1) => String.fromCharCode(parseInt(p1, 16)))
  .replace(/\\(\d{3})/g, (match, p1) => String.fromCharCode(parseInt(p1,  8)))
console.log(decoded)


服务器正在向您发送一个包含文字字符\ud83d\ude48(等等)的字符串,因此必须通过将转义序列转换为它们表示的unicode字符,以某种方式对字符串进行显式解码。另一方面,如果JavaScript代码中的字符串文字包含字符\ud83d\ude48,则它将被自动解码为🙈。

观察这两个字符串之间的区别:

console.log('\ud83d\ude48')
console.log('\\ud83d\\ude48')

09-25 17:34