对于一个工作项目,我使用的是无头Squeak (无显示,远程) Linuxserver,也使用Squeak在Windows开发人员机器上。
开发人员机器上的代码使用Monticello进行管理。不幸的是,我不得不使用SFTP将mcz复制到服务器上(例如,由于安全原因,服务器上不可能有一个推送存储库)。然后,代码由例如:
MczInstaller installFileNamed: 'name-b.18.mcz'.
一般都能用。
不幸的是,我们的代码库包含包含Umlauts和其他非ascii字符的字符串。在Monticello-重新导入过程中,其中一些被替换为其他字符,而一些被替换为一无所有。
我也试过了。
MczInstaller installStream: (FileStream readOnlyFileNamed: '...') binary
(注意..mcz实际上是..zip的,所以二进制应该是合适的,我想这是默认的)
找出如何使蒙蒂塞洛的转会保本( internal-encoding of non‘s)是我问题的主要目标。将所有源代码更改为仅使用ascii字符串(至少在此代码库中是如此)并不那么可取,因为需要手工操作。如果您对为什么不是简单的grep替换感兴趣,请阅读下面的注释:
(附带注意:(一个简化/特例)代码基使用Side的#text:方法来呈现包含必须由html-转义的字符的字符串。这适用于我们的非ascii,例如,它将ä转换为ä,如果我们要grep-显式地用ä替换文字,那么我们将不得不使用#html:方法(否则双转义),但是这将要求我们替换所有其他必须为html转义的字符(例如&),但是源代码本身也包含这样的字符。还有其他一些情况,比如一些使用第三方字符串的#text:s,它们可能不会被#html的.取代。)
发布于 2013-05-20 14:11:03
Squeak内部使用unicode (ISO 10646)对字符串中的字符进行编码。
它可能对16r80到: 16r9F范围内的字符使用像CP1252这样的扩展,但我现在不太确定了。
字符代码是按照流source.st上的方式编写的,当所有字符都是<= 16 all时,这些代码是由ByteString的单个字节组成的。在这种情况下,文件应该看起来像在ISO-8859-L1或CP1252编码。
如果您的字符代码>16 you,则在Squeak中使用WideString。同样,代码是按照流source.st上的方式编写的,但这一次是32位代码(按大端顺序编写)。从技术上讲,编码是UTF-32BE。
那么MczInstaller是做什么的呢?它使用快照/source.st e.st文件,并使用setConverterForCode读取该文件,该文件要么是UTF-8,要么是MacRoman.因此,非ASCII字符可能会被更改,如果WideString被重新解释为ByteString,情况就更糟了。
MC本身并不使用存档中的快照/source.st e.st成员。
相反,它使用snapshot.bin (参见MCMczReader,MCMczWriter中的代码)。
这是一个二进制文件,其格式由DataStream控制。
您应该使用的代码片段是:
MCMczReader loadVersionFile: 'YourPackage-b.18.mcz'发布于 2013-05-20 12:01:33
Monticello并不真正了解字符编码。我不知道squeak的当前情况,但我最后一次调查它时,有一个假定的latin1字符编码。但这意味着它应该在你的情况下完美无缺地工作。
不管怎么说,如果你是从同一种图像上写作和阅读的话,它应该能起作用。如果正确的字符编码通常失败,内部字节表示将从内存写入磁盘。虽然这样可以防止任何跨方言的包交换,但如果使用相同的图像类型,则应该可以工作。
无论如何,有些事情应该或可能奏效,但它们经常出错。因此,大多数项目都试图避免在代码中使用非7位字符。您不需要将非7位字符转换为HTML实体。您可以使用
Character value: 228用于在不使用非7位字符的情况下生成代码。对于每个您想要添加转换的字符,您可以这样做。
$ä asciiValue => 228我知道这不是一些人想得到的答案。但是monticello是这些东西之一,仍然需要为正确的字符编码进行调整。
https://stackoverflow.com/questions/16645848
复制相似问题