真的好,不好的UTF-8示例测试数据[关闭]


88

因此,我们有XSS备忘单来测试XSS过滤-但是除了示例性的良性页面之外,我找不到任何邪恶或格式错误的测试数据来确保我的UTF-8代码可以处理行为异常的数据。

我在哪里可以找到一些很好的数据来进行测试?或什么是棘手的字符序列?


4
columbia.edu/kermit/utf8.html是另一个很好的平台
Xeoncross


14
ăѣ𝔠ծềſģȟᎥ𝒋ǩľḿꞑȯ𝘱𝑞𝗋𝘴ȶ𝞄𝜈ψ𝒙𝘆𝚣1234567890!@#$%^&*()-_ = + [{]} ;:'“,<。> /?~𝘈Ḇ𝖢𝕯٤ḞԍНǏ𝙅ƘԸⲘ𝙉০Ρ𝗤Ɍ𝓢ȚЦ𝒱Ѡ𝓧ƳȤѧᖯć𝗱ễ𝑓𝙜Ⴙ𝞲𝑗𝒌ļṃʼnо𝞎𝒒ᵲꜱ𝙩ừ𝗏ŵ𝒙𝒚ź1234567890!@#$%^&*()-_=+[{]};:'",<.>/?〜АḂⲤ𝗗𝖤𝗙ꞠꓧȊ𝐉𝜥ꓡ𝑀𝑵Ǭ𝙿𝑄Ŗ𝑆𝒯𝖴𝘝𝘞ꓫŸ𝜡ả𝘢ƀ𝖼ḋếᵮℊ𝙝Ꭵ𝕛кιṃդⱺ𝓅𝘲𝕣𝖘ŧ𝑢ṽẉ𝘅ყž1234567890!@#$%^&*()-_ = + [{]}; :'“,<。> /?~Ѧ𝙱ƇᗞΣℱԍҤ١𝔍К𝓛𝓜ƝȎ𝚸𝑄Ṛ𝓢ṮṺƲᏔꓫ𝚈𝚭𝜶Ꮟçძ𝑒𝖿𝗀ḧ𝗂𝐣ҝɭḿ𝕟𝐨𝝔𝕢ṛ𝓼тú𝔳ẃ⤬𝝲𝗓1234567890!@#$%^&*()-_=+[{]};:'",<.>/?〜𝖠Β𝒞𝘋𝙴𝓕ĢȞỈ𝕵ꓗʟ𝙼ℕ০𝚸𝗤ՀꓢṰǓⅤ𝔚Ⲭ𝑌𝙕𝘢𝕤–
Andrew

Answers:


98

1
尽管您没有为此付出任何努力,但该页面正是我想要的。;)
Xeoncross

75
别忘了,知道在哪里找到答案与知道答案一样重要。
乔纳森·莱夫勒

19
我警告您,他的测试是基于UTF-8的过时定义,在删除17号及以上平面之前,允许5和6字节序列。这意味着在UTF-8中,代码点U + FFFE和U + FFFF无效,而根据Unicode联合会它们不是
Simon Kissane 2014年

34

另请参见具有汉字的文件如何知道每个字符要使用多少个字节?—毫无疑问,还有其他SO问题也将有所帮助。

在UTF-8中,您获得以下字节类型:

Binary    Hex          Comments
0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
10xxxxxx  0x80..0xBF   Continuation bytes (1-3 continuation bytes)
110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
11110xxx  0xF0..0xF4   First byte of a 4-byte character encoding

(最后一行看起来应该读为0xF0..0xF7;但是,Unicode的21位范围(U + 0000-U + 10FFFF)表示最大有效值为0xF4;值0xF5..0xF7不会出现在有效的UTF-8。)

查看特定的字节序列是否有效的UTF-8意味着您需要考虑:

  • 连续字节出现在意外的地方
  • 非连续字节出现在需要连续字节的位置
  • 字符串末尾的字符不完整(“预期的继续字节”的变化)
  • 非最小序列
  • UTF-16替代

在有效的UTF-8中,字节0xF5..0xFF不会出现。

非最小序列

一些字符可能有多种表示形式。例如,Unicode字符U + 0000(ASCII NUL)可以表示为:

0x00
0xC0 0x80
0xE0 0x80 0x80
0xF0 0x80 0x80 0x80

但是,Unicode标准明确规定了后三种选择不是可接受的,因为它们不是最小的。碰巧字节0xC0和0xC1永远不会出现在有效的UTF-8中,因为只有那些可以被它们编码的字符才被最小编码为0x00..0x7F范围内的单字节字符。

UTF-16代理人

在基本多语言平面(BMP)中,Unicode值U + D800-U + DFFF保留给UTF-16替代,不能以有效的UTF-8编码显示。如果它们在UTF-8中有效(我强调,它们不是有效的),则将对替代进行编码:

  • U + D800 — 0xED 0xA0 0x80(最小的高替代值)
  • U + DBFF — 0xED 0xAF 0xBF(最大代理)
  • U + DC00 — 0xED 0xB0 0x80(最小的低代理)
  • U + DFFF — 0xED 0xBF 0xBF(最大的低替代项)

不良数据

因此,您的BAD数据应包含违反这些规定的样本。

  • 连续字节之前没有初始字节值之一
  • 多字符初始字节,后跟足够的连续字节
  • 非最小多字节字符
  • UTF-16替代
  • 无效的字节(0xC0、0xC1、0xF5..0xFF)。

请注意,字节序标记(BOM)U + FEFF,也就是零宽度不间断空格(ZWNBSP),不能在UTF-8中未编码显示-有效的UTF-8中不允许字节0xFF和0xFE。编码的ZWNBSP可以在UTF-8文件中显示为0xEF 0xBB 0xBF,但是BOM在UTF-8中是完全多余的。


Unicode中也有一些字符。U + FFFE和U + FFFF是两个这样的非字符(每个平面中的最后两个代码点U + 1FFFE,U + 1FFFF,U + 2FFFE,U + 2FFFF,... U + 10FFFE,U + 10FFFF是其他)。这些通常不应出现在Unicode数据中以进行数据交换,而可以私下使用。有关许多肮脏的细节,包括Unicode中非字符的相当复杂的历史记录,请参见Unicode FAQ链接。(2013年1月发布的勘误9:关于非字符的澄清,如其标题所述—阐明了非字符的含义。)


感谢这份很棒的清单。我计划现在更详细地检查每一个。
Xeoncross

3
关于非字符“不应出现在UTF-8编码的数据中”的评论具有误导性。非字符不应出现在用于开放交换的UTF-8编码数据中,但仍应被UTF-8编码器/解码器接受
Simon Kissane 2014年

@SimonKissane:显然,我是2013年1月发布的现状勘误#9引起的众多困惑之一。有关非字符的Unicode FAQ的整个部分值得一读。谢谢(你的)信息。(我还将注意到,我的评论中的“应该”与Unicode标准所说的一致(但不是“说”);其目的是它们不应出现在“开放式互换”中,但可以用于“内部使用”。 '。)
Jonathan Leffler 2014年

1
@AdrianMaire:请参见Unicode(9.0.0)标准第3章中的表3.6 (页码125; PDF文件的p54)。我不确定您正在咨询哪些其他资源,但是我想我所说的内容已包含在该表中。
Jonathan Leffler

@JonathanLeffler您是正确的100%,感谢您的参考。
艾德里安·梅尔

17

您可以使用Jeffrey Bergamini提供的这种方便的在线工具将任何文本转换为真正奇怪的UTF8象形文字字符串。

典型的

Lorem ipsum dolor坐镇,奉献自若,sius do eiusmod tempor incididunt ut Labore et dolore magna aliqua。

变成这样:

ӓṁệẗᶆᶙṁᶙṁӓṁệẗӓṁệẗӓṁệẗḉįɳġḉḉįʈįʈįʈḉḉꞡᶇꞡᶇꞡᶇꞡᶇꞡᶇꞡᶇꞡᶇꞡᶇ。


6
我猜想是因为这对测试UTF8并没有真正的帮助:您无法获得接近全部案例的信息,没有“坏”案例,而且格式对测试没有帮助。这只是获得奇怪角色的一种方法。
Adrian Maire'3

你试过了吗?该生成器不是好玩的。它为您提供了来自完整UTF-8范围的字符,并且由于它们与实际字符非常相似,因此您可以“了解”哪些字符给您带来了问题。在示例中,我发布了6个字符,我的iPhone将这些字符渲染为带框的问号。
Shebuka

4
海事组织,这个奇妙的工具本来可以成为一个很好的解释“附加值”,但它本身不适合作为SO的答案(也是因为该页面可能已停产)。无论如何,我同意没有解释的-1不是很有建设性的。
阿德里安·梅尔

因此,这是“良好的,良好的utf-8示例测试数据” ...值得相关报道,IMO
Rondo,


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.