Character encoding Squeak-Monticello字符编码

Character encoding Squeak-Monticello字符编码,character-encoding,smalltalk,squeak,monticello,Character Encoding,Smalltalk,Squeak,Monticello,对于一个工作项目,我在(无显示、远程)Linuxserver上使用headless Squeak,在Windows developer机器上也使用Squeak 开发人员机器上的代码使用Monticello进行管理。不幸的是,我必须使用SFTP将mcz复制到服务器上(例如,出于安全原因,服务器上不可能有推送存储库)。然后,代码由以下代码合并: MczInstaller安装文件名为:“name-b.18.mcz”。 这通常是有效的 不幸的是,我们的代码库包含包含UMLAUT和其他非ascii字符的字

对于一个工作项目,我在(无显示、远程)Linuxserver上使用headless Squeak,在Windows developer机器上也使用Squeak

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

MczInstaller安装文件名为:“name-b.18.mcz”。

这通常是有效的

不幸的是,我们的代码库包含包含UMLAUT和其他非ascii字符的字符串。在Monticello重新导入期间,其中一些角色被其他角色替换,而另一些角色则被零替换

我也试过

MczInstaller installStream:(FileStream readOnlyFileNamed:“…”)二进制文件

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

找出如何使Monticello的传输保留内部的吱吱声是我问题的主要目标。将所有源代码更改为仅使用ascii字符串(至少在这个代码库中)不太可取,因为需要人工。如果您感兴趣的是为什么在这种情况下它不是一个简单的grep替换,请阅读以下旁注:


(旁注:(简化/特殊情况)代码库使用Seaside的#text:method来呈现包含必须进行html转义的字符的字符串。这与我们的非ascii很好,例如,它将
ä
转换为
ä;
,如果我们要用
ä;
显式地grep替换文本ä,那么我们将不得不使用#html:method(否则为双转义),但这将要求我们替换所有其他必须进行html转义的字符(例如&),但源代码本身也包含此类字符。还有其他情况,如一些采用第三方字符串的#text:,它们可能不会被#html的..替换。)蒙蒂塞洛并不真正了解字符编码。我不知道squeak的现状,但上次我研究它时,假设字符编码为拉丁1。但这意味着它在你的情况下应该可以完美地工作

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

无论如何,有些事情应该或可能会奏效,但它们经常出错。因此,大多数项目都试图避免在代码中使用非7bit字符。 您不需要将非7bit字符转换为HTML实体

Character value: 228
用于在代码中生成一个ä,而不使用非7位字符。对于每个要添加转换的字符,都可以进行转换

$ä asciiValue => 228
我知道这不是一些人想要得到的答案。但蒙蒂塞洛是其中之一,仍然需要调整以进行适当的字符编码。

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

字符代码在stream source.st上按原样写入,当所有字符都是16rFF时,这些代码由一个字节组成,然后在Squeak中使用一个宽字符串。代码再次按原样在stream source.st上写入,但这次是32位代码(按大端顺序写入).从技术上讲,编码是UTF-32BE

现在MczInstaller做了什么?它使用snapshot/source.st文件,并使用
setConverterForCode
读取此文件,它是UTF-8或MacRoman…因此非ASCII字符可能会被更改,而WideString的情况更糟,它将被重新解释为ByteString

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

您应该使用的代码段是:

MCMczReader loadVersionFile: 'YourPackage-b.18.mcz'