【问题标题】:Create invalid UTF8 string创建无效的 UTF8 字符串
【发布时间】:2017-09-11 01:04:27
【问题描述】:

是否可以使用 Javascript 创建无效的 UTF8 字符串?

我找到的每个解决方案都依赖于String.fromCharCode,它会生成undefined,而不是无效的字符串。我看到有人提到格式错误的 UTF8 字符串(即https://developer.mozilla.org/en-US/docs/Web/API/WebSocket#send())会产生错误,但我不知道你将如何实际创建一个。

【问题讨论】:

  • 这里提到的错误与UTF-8字符串无关,javascript内部一般不使用UTF-8来表示字符串。
  • @pvg:感谢您指出错误。不知道为什么我认为 UTF8 是 javascript 编码。我的问题应该更具体:如何创建包含不成对代理项的字符串?
  • 我不完全确定,文档看起来很模糊,尽管可以深入到 javascript 字符串的内部并做很多奇怪的事情而不会立即着火。 i.imgur.com/sWVE0IY.png

标签: javascript utf-8


【解决方案1】:

使用 JavaScript 生成无效 UTF-8 字符串的一种方法是获取表情符号并删除最后一个字节。

例如,这将是一个无效的 UTF-8 字符串:

const invalidUtf8 = '???'.substr(0,5);

【讨论】:

    【解决方案2】:

    JavaScript 中的字符串是 UTF-16 代码单元的计数序列。代码单元代表 Unicode 代码点有一个隐含的约定。即便如此,也可以表示任何 UTF-16 代码单元序列——甚至是不成对的代理。

    我发现String.fromCharCode(0xd801) 返回替换字符,这似乎很合理(而不是undefined)。任何文本函数都可以这样做,但出于效率原因,我确信许多文本操作只会传递无效序列,除非操作需要将它们解释为代码点。

    创建此类字符串的最简单方法是使用字符串文字。例如,"\uD83D \uDEB2""\uD83D""\uDEB2" 而不是有效的 "\uD83D\uDEB2"

    "\uD83D \uDEB2".replace(" ","") 实际上确实返回了"\uD83D\uDEB2" ("?"),但我认为您不应指望来自不是 Unicode 代码点的有效 UTF-16 编码的字符串的任何好处。

    【讨论】:

    • 没有什么好处正是我所希望的 ;) 我试图在 websocket 中可靠地生成一个错误以用于测试目的。不幸的是,您提供的字符串文字被转换为由空格分隔的两个替换字符(至少在 Chrome 中)。不过感谢您提供的信息。知道还是有用的。
    猜你喜欢
    • 2013-05-04
    • 2010-11-21
    • 2021-02-06
    • 2019-10-09
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    相关资源
    最近更新 更多