**:
在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...