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

人们如何在Smalltalk中实现UTF-8?,utf-8,smalltalk,Utf 8,Smalltalk,我一直在做一些初步的工作来实现UTF8String,为此我必须解决与消息相关的问题,例如\size,\at:,\do:,等等。在这些问题中,我找不到一个好的解决方案。示例包括#new:(类端)和#at:put:(实例),因为它们需要(或使用)的字节数取决于字符串最终包含的实际字符 一个可以考虑的想法是在尾部中分配额外的(未使用的)空字节,这实际上不是字符串的一部分,使用 >:只有在那些情况下,一个空的位置用完了。这是个好主意(还是坏主意)?正确的实现应该如何工作?我认为最好只在导入和导出时使用U

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


一个可以考虑的想法是在尾部中分配额外的(未使用的)空字节,这实际上不是字符串的一部分,使用<代码> >:只有在那些情况下,一个空的位置用完了。这是个好主意(还是坏主意)?正确的实现应该如何工作?

我认为最好只在导入和导出时使用UTF8。在内部,使用32位字符。

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

这样就可以很容易地实现预分配额外字节的策略,因为可以将有效大小存储到另一个实例变量中。由您调整代码复杂性/效率、内存/速度平衡

优点是避免与其他VM原语(如copyReplaceFrom:to:with:startingAt:)混淆,后者可以将原始编码从一个面向字节的类传输到另一个面向字节的类,从而可能造成对编码的错误解释


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

如果您能负担得起这项工作,那么对于所有字符,您可以做得比使用32位要好得多。实际文本要么全部是ascii(英语语言、程序),要么有一些非ascii字符(德语、法语),要么几乎是完整的多字节文本。对于那些有一些非ascii码的用户,您可以保留一个支持数据结构来帮助#at:等。

我同意。我之所以研究这个问题,是为了提供一些基本的工具,用于检查和调试用于导入/导出目的的UTF-8序列。在Python中,他们通过内部使用UTF-32(基本上如伯特所建议的那样)解决了这个问题,UTF-32是一种固定宽度的编码(尽管他们通过删除未使用的字节进行优化)。请参阅legacy.python.org/dev/peps/pep-0393。虽然我同意伯特的观点,但要小心。即使对代码点使用32位,也不能保证一个32位代码点始终是一个字符。:)谢谢,很好。我已经考虑过这一点,但没有尝试(到目前为止),因为新类不会从字符串继承,这可能会造成一些同步问题(两个类一起演化),再加上似乎是代码的重大重复(尽管对此不太确定)。@LeandroCaniglia ok,可能是Cuis中的一个问题,在这个方案中,String需要是一个抽象(指针)类,UTF8String需要是一个variableByteSubclass,并通过测试另一个类(使用一些众所周知的编码约定),就像在Squeak中一样。哦,是的。你是对的!我没有考虑过这种可能性。我没有使用CUI,但在我的系统中,抽象类
String
是bytes。你关于重构的想法现在对我来说很有意义。有没有关于数据结构保存在哪里的建议?我唯一能想到的是一个属性(字节对象中没有实例变量。)这就是你的建议吗?我想说,以一种特殊的方式使用第一个字节。