Как я могу повторно добавить маркер порядка байтов Юникода в Linux?

У меня довольно большой файл SQL, который начинается с маркера порядка следования байтов FFFE. Я разбил этот файл с помощью инструмента разбивки linux с поддержкой Unicode на 100 000 строк. Но при передаче их обратно в окна он не похож на любую из частей, кроме первой, поскольку только на нем есть маркер порядка следования байтов FFFE.

Как я могу добавить этот двухбайтовый код, используя echo (или любую другую команду bash)?

13
задан Neil Trodden 25 June 2009 в 15:31
поделиться

3 ответа

Что-то вроде (сначала резервное копирование)):

for i in $(ls *.sql)
do
  cp "$i" "$i.temp"
  printf '\xFF\xFE' > "$i"
  cat "$i.temp" >> "$i"
  rm "$i.temp"
done
3
ответ дан 1 December 2019 в 17:55
поделиться

Ответ Мэтью Флашена хороший, однако в нем есть несколько недостатков.

  • Перед усечением исходного файла не проверяется успешность копирования. Было бы лучше поставить все в зависимость от успешного копирования или проверки существования временного файла, или работы с копией. Если вы предпочитаете пояс с подтяжками, вы бы сделали комбо, как я проиллюстрировал ниже
  • ls не нужен.
  • Я бы использовал лучшую переменную имя, чем "i" - возможно, "файл".

Конечно, вы можете быть очень параноиком и проверить наличие временного файла в начале, чтобы случайно не перезаписать его и / или используйте UUID или сгенерированное имя файла. Один из mktemp, tempfile или uuidgen подойдет.

2
ответ дан 1 December 2019 в 17:55
поделиться

Для решения общего назначения - что-то, что устанавливает правильную метку порядка байтов независимо от того, является ли файл UTF-8, UTF-16 или UTF-32 - я бы использовал vim's параметр «бомба» :

$ echo 'hello' > foo
$ xxd < foo
0000000: 6865 6c6c 6f0a                           hello.
$ vim -e -s -c ':set bomb' -c ':wq' foo
$ xxd < foo
0000000: efbb bf68 656c 6c6f 0a                   ...hello.

( -e означает работу в ex-режиме вместо визуального; -s означает не печатать сообщения о состоянии; -c означает «сделать это»)

9
ответ дан 1 December 2019 в 17:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: