如何从整数序列构造String实例



我想从Unicode代码点创建一个测试字符串

像这样的

 65 asCharacter asString,
 66 asCharacter asString,
 67 asCharacter asString,
 65 asCharacter asString,
769 asCharacter asString

String with: 65 asCharacter
       with: 66 asCharacter
       with: 67 asCharacter
       with: 65 asCharacter
       with: 769 asCharacter

这是有效的,但

我正在寻找一种将整数值数组转换为String类实例的方法。

#(65 66 67 65 769)

有内置的方法吗?我正在寻找这样的答案在Smalltalk实现中测试Unicode支持的正确方法是什么?一个,但字符串除外。

多种

1.#stream内容:

如果您正在进行更大的字符串连接/构建,请使用流,因为它更快。如果只是连接两个字符串,则使用可读性更强的字符串。

String streamContents: [ :aStream |
    #(65 66 67 65 769) do: [ :each |
        aStream nextPut: each asCharacter
    ]
]

String streamContents: [ :aStream |
    aStream nextPutAll: (#(65 66 67 65 769) collect: #asCharacter)
]

2.#withAll:

String withAll: (#(65 66 67 65 769) collect: #asCharacter)

3.#collect:as:String

#(65 66 67 65 769) collect: #asCharacter as: String

4.#joinUsing:字符

(#(65 66 67 65 769) collect: #asCharacter) joinUsing: ''

注:

至少在Pharo中,您可以使用[ :each | each selector ],也可以仅使用#selector。我发现后者对于简单的事情来说更容易阅读,但这可能是个人的偏好。

用#withAll:构造String实例

String withAll: 
   (#(65 66 67 65 769) collect: [:codepoint | codepoint asCharacter])

这里有一个"低级别"变体:

codepoints := #(65 66 67 65 769).
string := WideString new: codepoints size.
codepoints withIndexDo: [:cp :i | string wordAt: i put: cp].
^string

请将以下内容视为非常糟糕的、未记录的、不受支持的,因此绝对错误的做法
你可能会认为你不能那么容易地混合字符和整数,呃,你可以:

'' asWideString copyReplaceFrom: 1 to: 0 with: (#(65 66 67 65 769) as: WordArray).

事实上,这经过了一个原语,它并没有真正检查类,只是检查接收器和参数都是VariableWord类这一事实。。。

出于同样的原因(取决于WriteStream实现——比方说是脆弱的),这可以工作:

^'' asWideString writeStream
    nextPutAll: (#(65 66 67 65 769) as: WordArray);
    contents

这同样适用于ByteString和ByteArray。

当然,同样,我们也不要忘记最复杂的方法,BitBlt:

^((BitBlt toForm: (Form new hackBits: (WideString new: 5)))
    sourceForm: (Form new hackBits: (#(65 66 67 65 769) as: WordArray));
    combinationRule: Form over;
    copyBits;
    destForm) bits

我们再次利用WideString的WordArray特性作为Form(位图)的位的容器。

希望这个答案不会得到太多的选票,这是不值得的!

相关内容

  • 没有找到相关文章

最新更新