人们如何在Smalltalk中实现UTF-8?

时间:2016-09-22 22:03:11

标签: utf-8 smalltalk

我一直在做一些实施UTF8String的初步工作,我必须解决与#size#at:#do:等消息相关的问题。其中有一些我无法找到一个好的解决方案。示例包括#new:(类侧)和#at:put:(实例),因为它们需要(或使用)的字节数取决于字符串最终包含的实际字符。

可以考虑的一个想法是在尾部分配额外的(未使用的)空字节,这实际上不是字符串的一部分,并且仅在那些情况下使用#become:时,只有一个用完空位置。这是一个好(或坏)的想法吗?如何正确实施?

3 个答案:

答案 0 :(得分:2)

恕我直言,最好只使用UTF8进行导出。在内部,使用32位字符。

答案 1 :(得分:2)

一种解决方案是将字节序列保存到实例变量(ByteArray)中,因此使用基于普通指针的子类而不是使用variableByteSubclass。

然后,可以轻松实现预分配额外字节的策略,因为您可以将有效大小存储到另一个实例变量中。由您来调整代码复杂性/效率,内存/速度平衡。

优点是避免弄乱其他VM原语,如copyReplaceFrom:to:with:startingAt:它可以将原始编码从一个面向字节的类转移到另一个,可能会对编码产生错误的解释。

另一个优点是你不需要调用:super-power。

答案 2 :(得分:0)

如果你能负担得起,你可以比所有角色的32位好得多。实际文本是all-ascii(英语,程序),有一些非ascii字符(德语,法语)或几乎完整的多字节。对于那些有一些非ascii的人,你可以保留一个支持数据结构来帮助#at:等。