【发布时间】:2011-06-20 15:42:08
【问题描述】:
我不能使用预打包的 Unicode 字符串库,例如 ICU,因为它们会将二进制文件的大小扩大到疯狂的程度(这是一个 200k 的程序;ICU 是 16MB+!)。
我已经对所有内容使用了内置的 wchar_t 字符串类型,但我想确保在对字符串进行迭代或类似的事情方面我不会做任何愚蠢的事情。
是否有像 Fuzzers 这样的工具用于安全性但用于 Unicode?也就是说,在我的代码中抛出基本多语言平面之外的字符,并确保将事情正确处理为 UTF-16?
(哦,显然跨平台解决方案是可行的,尽管大多数跨平台的东西必须同时支持 UTF-8 和 UTF-16)
编辑:还要注意比 UTF-16 代理对不太明显的东西——比如重音符号!
【问题讨论】:
-
+1 好问题。请注意:
wchar_t根本不暗示您正在使用 Unicode。wprintf之类的函数并不能真正正确地处理 Unicode,您实际上必须确保您的字符串操作考虑到具有多个代码点的字符。事实上,我认为(虽然我不是 100% 确定)像wcsstr这样的函数 不 正确处理 U+0000FFFF 以上的字符,因为它们只是处理字符串就像使用固定长度编码一样。 -
@Mehrdad:在几乎每个 Windows 编译器上,
wchar_t表示 UTF-16。标准没有要求,但是所有的 windows API 函数都是这样写的。 -
@Mehrdad:
wcsstr不需要更新以处理大于U+FFFF的字符。简单的按字节比较就可以了(这是 UTF-8 和 UTF-16 的优点之一)。当您想要进行排序等操作时,事情会变得更加复杂。 -
@DeadMG: 1. 因为我的很多用户都在拨号。 2. 因为这个东西每月被下载(作为 ComboFix 的一部分)大约 400 万次,而我(嗯,我的朋友们)正在为带宽付费。
-
@Kerrek: 1.
wcslen不是 Windows API 函数。 2.wcslen从未声称要进行代码点解码。正如strlen对UTF-8的打印字符数毫无价值一样,wcslen对于 UTF-16 而言毫无价值。即使你让它足够聪明地处理代理对,你仍然不会有一个真正的字符数,因为像重音符号这样的东西是完整的代码点,但对单个字符有贡献。 3. 除了wcslen和wcschr,我不知道UTF-16 会破坏任何wcsXxx函数的问题。