UTF-8符号化ファイルBOMヘッダの検出と削除
3115 ワード
UTF-8符号化ファイルBOMヘッダの検出と削除
BOMとは、全称Byte Order Markであり、通常はテキストの先頭に現れ、バイト順(Big/Little Endian)を識別するために用いられるUnicode文字であり、それ以外に符号化(UTF-8/16/32)を識別することもでき、テキストの真ん中に現れるとzero width no-break spaceと解釈される.注意:Unicodeの詳細については、UTF-8、UTF-16、UTF-32&BOMを参照してください.UTF-8/16/32の場合、それらの名前の8/16/32は符号化単位が何ビットであるか、すなわち、それらの符号化単位はそれぞれ8/16/32ビットであり、バイトに換算すると1/2/4バイトであり、マルチバイトであればバイトシーケンスにかかわるが、UTF-8はシングルバイトを符号化単位とするため、バイトシーケンスは存在しない.UTF-8の主な利点はASCIIと互換性があることですが、BOMを使用すると、このメリットは消えてしまいます.それ以外に、BOMの存在はいくつかの問題を引き起こす可能性があります.例えば、次のエラーがBOMによる可能性があります. Shell: No such file or directory PHP: Warning: Cannot modify header information – headers already sent
UTF-8符号化におけるBOMの検出と削除の問題を詳細に議論する前に、一例でウォーミングアップしてみてはいかがでしょうか.
上記のように、最初の3バイトはそれぞれ357、273、277であり、これが8進法のBOMである.
以上のように,上位3バイトはそれぞれEF,BB,BFであり,これが16進法のBOMである.注意:サードパーティのWebサイトのページが使用されているため、インスタンスが常に使用可能であることは保証されません.実際にプロジェクト開発を行う場合、何百ものテキストファイルに直面する可能性があり、いくつかのファイルがBOMに混入している場合、気づきにくい.BOM付きUTF-8テキストファイルがなければ、viでいくつかを作成することができ、関連命令は以下の通りである.
UTF-8エンコーディングの設定:
BOMの追加:
BOMを削除:
照会BOM:
UTF-8コードのBOMを検出するにはどうすればいいですか?
UTF-8コードのBOMを削除するにはどうすればいいですか?
推奨:SVNを使用する場合は、pre-commitフックに関連コードを追加してBOMを根絶することができます.
本文はshellコマンドをたくさん使っていますが、紙幅に限りがありますので、詳しくは説明しませんが、分からないことがあれば自分で検索してください.
BOMとは、全称Byte Order Markであり、通常はテキストの先頭に現れ、バイト順(Big/Little Endian)を識別するために用いられるUnicode文字であり、それ以外に符号化(UTF-8/16/32)を識別することもでき、テキストの真ん中に現れるとzero width no-break spaceと解釈される.注意:Unicodeの詳細については、UTF-8、UTF-16、UTF-32&BOMを参照してください.UTF-8/16/32の場合、それらの名前の8/16/32は符号化単位が何ビットであるか、すなわち、それらの符号化単位はそれぞれ8/16/32ビットであり、バイトに換算すると1/2/4バイトであり、マルチバイトであればバイトシーケンスにかかわるが、UTF-8はシングルバイトを符号化単位とするため、バイトシーケンスは存在しない.UTF-8の主な利点はASCIIと互換性があることですが、BOMを使用すると、このメリットは消えてしまいます.それ以外に、BOMの存在はいくつかの問題を引き起こす可能性があります.例えば、次のエラーがBOMによる可能性があります.
UTF-8符号化におけるBOMの検出と削除の問題を詳細に議論する前に、一例でウォーミングアップしてみてはいかがでしょうか.
shell> curl -s http://phone.10086.cn/ | head -1 | sed -n l
\357\273\277<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional\
//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r$
上記のように、最初の3バイトはそれぞれ357、273、277であり、これが8進法のBOMである.
shell> curl -s http://phone.10086.cn/ | head -1 | hexdump -C
00000000 ef bb bf 3c 21 44 4f 43 54 59 50 45 20 68 74 6d |...<!DOCTYPE htm|
00000010 6c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 |l PUBLIC "-//W3C|
00000020 2f 2f 44 54 44 20 58 48 54 4d 4c 20 31 2e 30 20 |//DTD XHTML 1.0 |
00000030 54 72 61 6e 73 69 74 69 6f 6e 61 6c 2f 2f 45 4e |Transitional//EN|
00000040 22 20 22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 |" "http://www.w3|
00000050 2e 6f 72 67 2f 54 52 2f 78 68 74 6d 6c 31 2f 44 |.org/TR/xhtml1/D|
00000060 54 44 2f 78 68 74 6d 6c 31 2d 74 72 61 6e 73 69 |TD/xhtml1-transi|
00000070 74 69 6f 6e 61 6c 2e 64 74 64 22 3e 0d 0a |tional.dtd">..|
以上のように,上位3バイトはそれぞれEF,BB,BFであり,これが16進法のBOMである.注意:サードパーティのWebサイトのページが使用されているため、インスタンスが常に使用可能であることは保証されません.実際にプロジェクト開発を行う場合、何百ものテキストファイルに直面する可能性があり、いくつかのファイルがBOMに混入している場合、気づきにくい.BOM付きUTF-8テキストファイルがなければ、viでいくつかを作成することができ、関連命令は以下の通りである.
UTF-8エンコーディングの設定:
:set fileencoding=utf-8
BOMの追加:
:set bomb
BOMを削除:
:set nobomb
照会BOM:
:set bomb?
UTF-8コードのBOMを検出するにはどうすればいいですか?
shell> grep -r -I -l $'^\xEF\xBB\xBF' /path
UTF-8コードのBOMを削除するにはどうすればいいですか?
shell> grep -r -I -l $'^\xEF\xBB\xBF' /path | xargs sed -i 's/^\xEF\xBB\xBF//;q'
推奨:SVNを使用する場合は、pre-commitフックに関連コードを追加してBOMを根絶することができます.
#!/bin/bash
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
for FILE in $($SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[AU]/ {print $NF}'); do
if $SVNLOOK cat -t "$TXN" "$REPOS" "$FILE" | grep -q $'^\xEF\xBB\xBF'; then
echo "Byte Order Mark be found in $FILE" 1>&2
exit 1
fi
done
本文はshellコマンドをたくさん使っていますが、紙幅に限りがありますので、詳しくは説明しませんが、分からないことがあれば自分で検索してください.