2013-05-20 2 views
2

Для работы проекта я использую обезглавленное Squeak на (displayless, дистанционная) Linuxserver, а также с помощью Squeak на Windows, разработчик-машины.Писк Монтичелло кодировки символов

Код на машине для разработчиков управляется с использованием Monticello. Мне нужно скопировать mcz на сервер с помощью SFTP, к сожалению (например, наличие резервных копий на сервере невозможно по соображениям безопасности). Код затем слиты, например:

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

который обычно работает.

К сожалению, наша кодовая база содержит строки, содержащие символы Umlauts и другие символы, отличные от ascii. Во время Monticello-reimport некоторые из них заменяются другими персонажами, а некоторые заменяются ничем.

Я также пробовал, например.

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

(примечание .mcz являются на самом деле .zip, поэтому двоичная должны быть уместными, я думаю, это по умолчанию в любом случае)

Выяснить, как сделать передачу Монтичелло в сохранить писк внутренний -кодирование не-ascii's является основным Цель моего вопроса. Изменение всего исходного кода только для использования ascii-строк - это (по крайней мере, в этой кодовой базе) гораздо менее желательно, поскольку задействован ручной труд. Если вы заинтересованы в почему это не просто Grep -replace в данном случае прочитать это побочное замечание:

(Примечание стороны: (упрощенный/специальный случай) кодовые использует #text приморского в: метод для отображения строк, содержащих символы, которые должны быть html-экранированными. Это отлично работает с нашими не-ascii, например, он преобразует ä в ä, если мы должны были grep-заменить буквальный ä's на ä явно, тогда нам нужно будет использовать вместо этого вместо метода #html: (else double-escape), но тогда потребуется заменить все остальные символы, которые также должны быть html-экранированы (например, &), но затем исходный код self содержит такие символы. И есть другие случаи, например, некоторые #text: s, которые берут сторонние строки, они не могут быть заменены на # html's ...)

ответ

3

Squeak использует код Unicode (ISO 10646) для кодирования символов в строке.
Он может использовать расширение, например CP1252, для символов в диапазоне от 16 до 80: 16r9F, но я больше не уверен.

Коды символов записываются как есть в источнике потока.st, и эти коды состоят из одного байта для байтовой строки, когда все символы: < = 16rFF. В этом случае файл должен выглядеть как кодированный в ISO-8859-L1 или CP1252.

Если у вас есть коды символов> 16rFF, то в Squeak используется WideString. Еще раз коды записываются так же, как и в источнике потока.st, но на этот раз это 32-битные коды (написанные в порядке big-endian). Технически, кодирование, таким образом, является UTF-32BE.

Теперь, что делает MczInstaller? Он использует файл snapshot/source.st и использует setConverterForCode для чтения этого файла, который является UTF-8 или MacRoman ... Поэтому символы без ASCII могут быть изменены, и это еще хуже в случае WideString, который будет повторно -интерпретируется как ByteString.

Сам МС не использует член моментального снимка/source.st в архиве.
Это скорее использует snapshot.bin (см. Код в MCMczReader, MCMczWriter).
Это двоичный файл, формат которого определяется DataStream.

Сниппет, что вы должны использовать достаточно:

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

Monticello на самом деле не знает кодировки символов. Я не знаю нынешнюю ситуацию в скрипе, но в последний раз, когда я заглядывал в нее, существовала предполагаемая кодировка символов latin1. Но это будет означать, что он должен работать безупречно в вашей ситуации.

Он должен как-то работать, если вы пишете и читаете один и тот же образ. Если надлежащее кодирование символов не выполняется, обычно представление внутреннего байта записывается из памяти на диск. Хотя это предотвращает обмен кросс-диалектом пакетов, он должен работать, если использовать один и тот же вид изображения.

Во всяком случае есть вещи, которые должны или могли работать, но они часто идут неправильно. Поэтому большинство проектов стараются избегать использования не 7-битных символов в коде. Вам не нужно преобразовывать несимметричные символы в объекты HTML.Вы можете использовать

Character value: 228 

для создания кода в вашем коде без использования несимметричных символов. На каждом персонаже вы хотели бы добавить преобразование можно сделать

$ä asciiValue => 228 

Я знаю, что это не тот ответ, некоторые хотели бы получить. Но monticello - одна из тех вещей, которые все еще нужно скорректировать для правильной кодировки символов.

Смежные вопросы