如何在linux中重新添加unicode字节顺序标记?

Nei*_*den 13 linux unicode bash

我有一个相当大的SQL文件,它以FFFE的字节顺序标记开头.我使用unicode感知的linux拆分工具将此文件拆分为100,000行块.但是经过这些回窗口时,它喜欢任何比第一个以外的部分的,因为只有它在FFFE字节顺序标记.

如何使用echo(或任何其他bash命令)添加这两个字节的代码?

bri*_*out 15

基于sed的Anonymous解决方案,sed -i '1s/^/\xef\xbb\xbf/' foo将BOM添加到UTF-8编码文件中foo.有用的是,它还将ASCII文件转换为带有BOM的UTF8


yin*_*ted 11

要将BOM添加到以"foo-"开头的所有文件,您可以使用sed.sed可以选择进行备份.

sed -i '1s/^\(\xff\xfe\)\?/\xff\xfe/' foo-*
Run Code Online (Sandbox Code Playgroud)

strace这显示sed创建一个名为"sed"的临时文件.如果您确定已经没有BOM,则可以简化命令:

sed -i '1s/^/\xff\xfe/' foo-*
Run Code Online (Sandbox Code Playgroud)

确保您需要设置UTF-16,因为即UTF-8不同.

  • 对于 UTF-8,请使用 `\xef\xbb\xbf`;对于 UTF-16 小尾数法,请使用 `\xff\xfe`;对于 UTF-16 大端字节序,请使用 `\xfe\xff`。请参阅 https://www.w3.org/International/questions/qa-byte-order-mark (2认同)

and*_*otn 9

对于通用解决方案 - 设置正确的字节顺序标记,无论文件是UTF-8,UTF-16还是UTF-32-I,我都会使用vim的'bomb'选项:

$ 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.
Run Code Online (Sandbox Code Playgroud)

(-e表示以ex模式而不是可视模式运行; -s表示不打印状态消息; -c表示"执行此操作")


Mar*_*ang 6

尝试 uconv

uconv --add-signature
Run Code Online (Sandbox Code Playgroud)


Mat*_*hen 3

像(先备份)):

for i in $(ls *.sql)
do
  cp "$i" "$i.temp"
  printf '\xFF\xFE' > "$i"
  cat "$i.temp" >> "$i"
  rm "$i.temp"
done
Run Code Online (Sandbox Code Playgroud)

  • BOM 代码点是 U+FEFF,但它在 UTF-8 中的字面表示是“EF BB BF”(三个字节)。仅当文件已采用 UTF-16、小端序时,此方法才有效。请参阅http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding (10认同)