我想从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(位图)的位的容器。
希望这个答案不会得到太多的选票,这是不值得的!