2013-05-20 51 views
2

對於我使用的無頭佳樂工作項目(無顯示器,遠程)Linuxserver也是一個的Windows開發人員使用計算機上的吱吱聲。佳樂蒙蒂塞洛字符編碼

開發人員機器上的代碼使用Monticello進行管理。不幸的是,我必須使用SFTP將mcz複製到服務器上(例如,出於安全原因,服務器上的推送存儲庫是不可能的)。該代碼然後通過如合併:

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

一般的作品。

不幸的是,我們的代碼庫包含字符串,其中包含變音和其他非ASCII字符。在Monticello- 重新進口其中一些被替換爲其他字符,一些被替換爲無。

我也試過例如

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

(注.mcz的實際上是名爲.zip的,所以二要適當,我想這是無論如何默認)

找出如何讓蒙蒂塞洛的轉會保持佳樂內部 -encioding的非ascii's是主要的目標我的問題。將所有源代碼更改爲僅使用ASCII字符串(至少在此代碼庫中)更不理想,因爲涉及手動操作。如果您有興趣爲什麼它不是一個簡單的grep -replace在這種情況下,讀這側面說明:

旁註:(簡化/特殊情況)的代碼庫使用海邊的#text:方法來呈現包含必須被html轉義的字符的字符串,這非常適合我們的非ASCII字符,例如,它會將ä轉換爲ä,如果我們要grep-明確地將字面值替換爲ä,那麼我們將不得不使用#html:方法代替(或者雙重轉義),但是那樣會要求我們替換所有必須被html轉義的其他字符(例如&),但是再次使用源代碼自我包含這樣的字符。還有其他一些情況,像#text:這是第三方字符串,它們可能不會被#html的替換...)

回答

3

Squeak在內部使用unicode(ISO 10646)對字符串中的字符進行編碼。
它可能會使用像CP1252這樣的擴展名來處理16r80到16r9F範圍內的字符,但我不太確定。

字符代碼按原樣寫入流source.st,當所有字符爲< = 16rFF時,這些代碼由ByteString的單個字節組成。在這種情況下,該文件應該看起來像在ISO-8859-L1或CP1252中編碼。

如果您有字符代碼> 16rFF,則在Squeak中使用WideString。代碼再一次寫入流source.st,但這次是32位代碼(以big-endian順序寫入)。從技術上講,編碼是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' 
2

Monticello並沒有真正意識到字符編碼。我不知道目前吱吱聲的情況,但是我最近一次查看它時,假設有一個latin1的字符編碼。但這意味着它應該在你的情況下完美地工作。

無論如何,如果您正在從同一種圖像中進行書寫和閱讀,它應該以某種方式工作。如果正確的字符編碼失敗,則通常將內部字節表示從內存寫入磁盤。雖然這可以防止任何跨語言交換包,但它應該工作,如果使用相同的圖像種類。

無論如何有應該可能工作,但他們經常出問題。所以大多數項目都試圖避免在代碼中使用非7位字符。 您不需要將非7位字符轉換爲HTML實體。您可以使用

Character value: 228 

用於在您的代碼中生成ä而不使用非7位字符。在你喜歡添加轉換的每個字符上,你可以做

$ä asciiValue => 228 

我知道這不是某種想要得到的答案。但monticello是這些東西仍然需要調整適當的字符編碼之一。