2

对于一个工作项目,我在(无显示、远程)Linux 服务器上使用无头 Squeak,并在Windows开发人员机器上使用 Squeak 。

开发人员机器上的代码使用 Monticello 进行管理。不幸的是,我必须使用 SFTP 将 mcz 复制到服务器(例如,出于安全原因,无法在服务器上拥有推送存储库)。然后将代码合并,例如:

MczInstaller installFileNamed: 'name-b.18.mcz'.

这通常有效。

不幸的是,我们的代码库包含包含元音变音和其他非 ascii 字符的字符串。在蒙蒂塞洛-重新导入期间,其中一些被其他字符替换,一些被替换为什么都没有。

我也试过了

MczInstaller installStream: (FileStream readOnlyFileNamed: '...') binary

(注意 .mcz 的实际上是 .zip 的,所以二进制应该是合适的,我想它是默认的)

找出如何使蒙蒂塞洛的传输保留非 ascii 的Squeak内部编码是我问题的主要目标。将所有源代码更改为仅使用 ascii 字符串(至少在此代码库中)不太可取,因为涉及人工。如果您对为什么在这种情况下它不是简单的grep -replace 感兴趣,请阅读此附注:

旁注:(简化/特殊情况)代码库使用 Seaside 的 #text: 方法来呈现包含必须进行 html 转义的字符的字符串。这适用于我们的非 ascii,例如,如果我们要转换äägrep-replace 文字 ä's byä显式,然后我们将不得不使用 #html: 方法代替(否则双转义),但是这将要求我们替换所有其他必须被 html 转义的字符(例如&),但源代码本身又包含这样的字符。还有其他情况,比如一些接受第三方字符串的#text:,它们可能不会被#html替换...)

4

2 回答 2

3

Squeak 在内部使用 unicode (ISO 10646) 对字符串中的字符进行编码。
对于 16r80 到:16r9F 范围内的字符,它可能会使用 CP1252 之类的扩展名,但我不太确定。

字符代码按原样写入流 source.st,当所有字符 <= 16rFF 时,这些代码由 ByteString 的单个字节组成。在这种情况下,文件应该看起来像以 ISO-8859-L1 或 CP1252 编码的。

如果您的字符代码 > 16rFF,则在 Squeak 中使用 WideString。代码再次按原样写入流 source.st,但这次是 32 位代码(以大端顺序编写)。因此,从技术上讲,编码是 UTF-32BE。

现在 MczInstaller 做了什么?它使用 snapshot/source.st 文件,并setConverterForCode用于读取这个文件,它是 UTF-8 或 MacRoman...所以非 ASCII 字符可能会被更改,而且在 WideString 的情况下更糟,这将被重新 -解释为字节串。

MC 本身不使用存档中的 snapshot/source.st 成员。
它使用的是 snapshot.bin(参见 MCMczReader、MCMczWriter 中的代码)。
这是一个二进制文件,其格式由 DataStream 控制。

您应该使用的代码段是:

MCMczReader loadVersionFile: 'YourPackage-b.18.mcz'
于 2013-05-20T14:11:03.930 回答
2

蒙蒂塞洛并不真正了解字符编码。我不知道 squeak 目前的情况,但上次我调查它时,假设字符编码为 latin1。但这意味着它应该在您的情况下完美地工作。

如果您正在从同一种图像写入和读取,它无论如何都应该以某种方式工作。如果正确的字符编码失败,通常内部字节表示会从内存写入磁盘。虽然这可以防止任何跨方言的包交换,但如果使用相同的图像类型,它应该可以工作。

无论如何,有些事情应该可以起作用,但它们经常出错。所以大多数项目都尽量避免在他们的代码中使用非 7 位字符。您不需要将非 7 位字符转换为 HTML 实体。您可以使用

Character value: 228

用于在您的代码中生成 ä 而不使用非 7 位字符。在您喜欢添加转换的每个字符上,您可以执行

$ä asciiValue => 228

我知道这不是某些人想要得到的答案。但是 monticello 是其中之一,仍然需要为正确的字符编码进行调整。

于 2013-05-20T12:01:33.263 回答