UTF 8 BOM,feff 位元組順序記號

2021-06-05 22:15:03 字數 2690 閱讀 3083

**:

在linux下做 html與 css檔案合併指令碼的時候發現讀取的 css檔案中不管怎麼做都會多一表「」標記,查資料發現這錶東西叫做「位元組順序記號」,是utf-8檔案的一部份,一般瀏覽器中 看不出來,但是用 vim就能看得到。如果直接複製到html則會把它當做乙個字元,會影響到**的執行。

由於我用的是vim工具,所以過濾起來還比較簡單,直接刪除就好了。其它工具也可以,不過得自己寫**刪除了,這個字元var_dump的結果是三個字元。

<?php

var_dump("");

?>

結果:string(3) "?"

有些編輯器,比如m$ windows的記事本,在建立utf8編碼檔案時會在頭部新增乙個不可見字元。這個字元可以通過vim檢視到,而且如果是乙個php檔案,php4、php5在解析時均會有輸出。

原來這個被稱作bom(byte order mark)的不可見字元,是unicode用來標識內部編碼的排列方式的,在utf-16、utf-32編碼裡它是必需的,而在utf-8裡是可選的。因 此,才會出現有的編輯器在檔案頭部新增新增bom、而有的語法解析器又不作處理的的混亂情況。

根據w3c裡faq的建議,解決方法就是,刪無赦!

所謂 bom,全稱是byte order mark,它是乙個unicode字元,通常出現在文字的開頭,用來標識位元組序 (big/little endian),除此以外還可以標識編碼(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的檢測與刪除問題前,不妨先通過乙個例子熱熱身:

# curl -s  | head -1 | sed -n l

\357\273\277\r$

如上所示,前三個位元組分別是357、273、277,這就是八進位制的bom。

# curl -s  | head -1 | xxd

0000000: efbb bf3c 2144 4f43 5459 5045 2068 746d .....

如上所示,前三個位元組分別是ef、bb、bf,這就是十六進製制的bom。

#設定utf-8編碼

:set fileencoding=utf-8

#新增bom

:set bomb

#刪除bom

:set nobomb

#查詢bom

:set bomb?

如何檢測utf-8編碼中的bom呢?

shell> grep -i -r -l $'\xef\xbb\xbf' *
如何刪除utf-8編碼中的bom呢?

shell> grep -i -r -l $'\xef\xbb\xbf' * | xargs sed -i 's/^\xef\xbb\xbf//;'
#!/bin/sh

repos="$1"

txn="$2"

svnlook=/usr/bin/svnlook

files=`$svnlook changed -t "$txn" "$repos" | awk `

for file in $files; do

content=`$svnlook cat -t "$txn" "$repos" "$file"`

if echo $content | head -c 3 | xxd -i | grep -q '0xef, 0xbb, 0xbf'; then

echo "bom!" 1>&2

exit 1

fidone

篇幅所限,恕不詳述,未盡事宜大家就請自己搜尋吧。

linux下處理windows utf8檔案,發現vim頭會多乙個

一般預設建立的檔案都是ansi編碼的。用記事本開啟這個檔案,點"另存為",最下面有個"編碼(encoding)"可以選擇,裡面有"ansi,utf8"等選項。

下面介紹用直接使用perl建立乙個utf-8的檔案

open( out, ">:utf8", "a.txt" ) or die "a.out: $!"; print out "\x"; print out "aaaa\n"; close out;
反過來,刪除檔案中的頭

open (fh, '<:utf8',"$_" ) or die $!;

s/\x//;

請注意此指令將會把檔案中第一行之外的全數清除。

grep -r -i -l $』^\xef\xbb\xbf』 /path | xargs sed -i 『s/^\xef\xbb\xbf//;q』

可用以下指令嘗試之:

grep -r -i -l $』^\xef\xbb\xbf』 /path | xargs sed -i 『s/^\xef\xbb\xbf//g』

寬位元組UTF 8 多位元組互轉

在進行windows程式設計時,常常遇到不同字元編碼之間的轉換以對應不同的輸出格式,本文介紹寬位元組utf 8編碼格式和多位元組之間的專案轉換。分別呼叫windows底層函式multibytetowidechar和 widechartomultibyte實現。1.utf 8轉多位元組 std str...

utf 8佔幾個位元組

佔2個位元組的 佔3個位元組的 基本等同於gbk,含21000多個漢字 佔4個位元組的 中日韓超大字符集裡面的漢字,有5萬多個 乙個utf8數字佔1個位元組 乙個utf8英文本母佔1個位元組 在查詢 utf 8 編碼資料時發現,很多的帖子說的 utf 8 編碼裡,乙個漢字占用3個位元組,有的還做了個...

多位元組 unicode和utf 8的轉換

本來在網上能找到很多這方面的 但很多都是 且很多細節讓人理解起來很彆扭,估計有的 的也是不知所云。雖說就兩個windows api的呼叫,但只有自己去寫 測試研究,才真正領會了這些細節。文中注釋有寫的不當的歡迎指正。下面是我寫的測試程式 cpp view plain copy include std...