我一直在做一些实施UTF8String
的初步工作,我必须解决与#size
,#at:
,#do:
等消息相关的问题。其中有一些我无法找到一个好的解决方案。示例包括#new:
(类侧)和#at:put:
(实例),因为它们需要(或使用)的字节数取决于字符串最终包含的实际字符。
可以考虑的一个想法是在尾部分配额外的(未使用的)空字节,这实际上不是字符串的一部分,并且仅在那些情况下使用#become:
时,只有一个用完空位置。这是一个好(或坏)的想法吗?如何正确实施?
答案 0 :(得分:2)
恕我直言,最好只使用UTF8进行导出。在内部,使用32位字符。
答案 1 :(得分:2)
一种解决方案是将字节序列保存到实例变量(ByteArray)中,因此使用基于普通指针的子类而不是使用variableByteSubclass。
然后,可以轻松实现预分配额外字节的策略,因为您可以将有效大小存储到另一个实例变量中。由您来调整代码复杂性/效率,内存/速度平衡。
优点是避免弄乱其他VM原语,如copyReplaceFrom:to:with:startingAt:它可以将原始编码从一个面向字节的类转移到另一个,可能会对编码产生错误的解释。
另一个优点是你不需要调用:super-power。
答案 2 :(得分:0)
如果你能负担得起,你可以比所有角色的32位好得多。实际文本是all-ascii(英语,程序),有一些非ascii字符(德语,法语)或几乎完整的多字节。对于那些有一些非ascii的人,你可以保留一个支持数据结构来帮助#at:等。