人们如何在 Smalltalk 中实现 UTF-8?
How do people implement UTF-8 in Smalltalk?
我一直在做一些实施 UTF8String
的初步工作,为此我必须解决与 #size
、#at:
、#do:
等消息相关的问题,等等。其中有一些我找不到好的解决方案。示例包括 #new:
(class 端)和 #at:put:
(实例),因为它们需要(或使用)的字节数取决于字符串最终包含的实际字符。
一个可以考虑的想法是在尾部分配额外的(未使用的)空字节,这实际上不是字符串的一部分,并且仅在那些情况下使用 #become:
是空位置用完.这是一个好(或坏)主意吗?正确的实施应该如何运作?
恕我直言,最好只将 UTF8 用于导入和导出。在内部,字符使用 32 位。
一个解决方案是将字节序列保存到一个实例变量(一个 ByteArray)中,然后使用一个普通的基于指针的 subclass 而不是使用一个 variableByteSubclass.
然后可以轻松实现预分配额外字节的策略,因为您会将有效大小存储到另一个实例变量中。由你调整代码complexity/efficiency,memory/speed平衡。
优点是避免与其他 VM 原语混淆,例如 copyReplaceFrom:to:with:startingAt:它可以将原始编码从一个字节导向 class 传输到另一个字节,可能会造成对编码的错误解释。
另一个优点是您不需要调用 become: super-power。
如果你有能力付出努力,你可以做得比所有角色都变成 32 位要好得多。实际文本要么全是 ascii(英语、程序),要么有一些非 ascii 字符(德语、法语),要么几乎是完整的多字节文本。对于那些有一些非ascii的人,你可以保留一个支持数据结构来帮助#at:等
我一直在做一些实施 UTF8String
的初步工作,为此我必须解决与 #size
、#at:
、#do:
等消息相关的问题,等等。其中有一些我找不到好的解决方案。示例包括 #new:
(class 端)和 #at:put:
(实例),因为它们需要(或使用)的字节数取决于字符串最终包含的实际字符。
一个可以考虑的想法是在尾部分配额外的(未使用的)空字节,这实际上不是字符串的一部分,并且仅在那些情况下使用 #become:
是空位置用完.这是一个好(或坏)主意吗?正确的实施应该如何运作?
恕我直言,最好只将 UTF8 用于导入和导出。在内部,字符使用 32 位。
一个解决方案是将字节序列保存到一个实例变量(一个 ByteArray)中,然后使用一个普通的基于指针的 subclass 而不是使用一个 variableByteSubclass.
然后可以轻松实现预分配额外字节的策略,因为您会将有效大小存储到另一个实例变量中。由你调整代码complexity/efficiency,memory/speed平衡。
优点是避免与其他 VM 原语混淆,例如 copyReplaceFrom:to:with:startingAt:它可以将原始编码从一个字节导向 class 传输到另一个字节,可能会造成对编码的错误解释。
另一个优点是您不需要调用 become: super-power。
如果你有能力付出努力,你可以做得比所有角色都变成 32 位要好得多。实际文本要么全是 ascii(英语、程序),要么有一些非 ascii 字符(德语、法语),要么几乎是完整的多字节文本。对于那些有一些非ascii的人,你可以保留一个支持数据结构来帮助#at:等