如何比较 Smalltalk 中的本地化字符串?

How to compare localized strings in Smalltalk?

是否可以比较某些 Smalltalk 实现中的本地化字符串?目前为止我遇到的只有 Pharo 和 GNU ST,它们似乎都缺乏这种能力。似乎唯一的可能性是从头开始编写一个 ICU 包装器。 (这远远超出了我的经验。)

我知道这是一个复杂的功能。不幸的是,到处都需要它,例如,在网络应用程序中排序菜单。

我的意思是:

'á' > 'a' => true

以及使用比较对字符串数组进行排序的可能性:

#('č' 'ř' 'a' 'r' 'á') asSortedCollection => #('a' 'á' 'č' 'r' 'ř')

我不会说其他方言,但是GemStone确实有这个能力:

topaz 1> run
'á' > 'a'
%
true
topaz 1> run
#('č' 'ř' 'a' 'r' 'á') asSortedCollection printString
%
aSortedCollection( 'a', 'á', '\u010d', 'r', '\u0159')
topaz 1> 

有关详细信息,请参阅 Programmer's Guide

从 NativeBoost(Pharo 4 中使用的旧 FFI 样式)转换为 UFFI 应该很简单。代码是on the gemstone repo。最简单的方法是 首先确保您可以 运行 在 Launcher 中使用已弃用版本的旧 Pharo 4 并验证它是否适合您。您可能需要安装 32 位库才能正常工作(或使用类似 32 位虚拟盒图像的东西)。独立于 NativeBoost 的包在 Pharo 8 中加载。有一个关于 UFFI

booklet

我会说 Smalltalk/X-jv branch 方言。如果我没记错的话 Smalltalk/X 本身就是 Unicode。

你的例子自然会给出你的结果。这是 Workspace 的直接粘贴(为了更好的可读性,在打印值之间添加 space):

'á' > 'a' true.

#('č' 'ř' 'a' 'r' 'á') asSortedCollection SortedCollection('a' 'r' 'á' 'č' 'ř')