Làm cách nào để xóa ï »¿từ đầu tệp?


145

Tôi có một tệp CSS trông ổn khi tôi mở bằng gedit , nhưng khi nó được đọc bởi PHP (để hợp nhất tất cả các tệp CSS thành một), CSS này có các ký tự sau được thêm vào: ï »

PHP loại bỏ tất cả các khoảng trắng, do đó, một sự ngẫu nhiên ở giữa mã làm rối tung toàn bộ. Như tôi đã đề cập, tôi thực sự không thể nhìn thấy các ký tự này khi tôi mở tệp trong gedit, vì vậy tôi không thể xóa chúng rất dễ dàng.

Tôi đã giải quyết vấn đề này và rõ ràng có điều gì đó không ổn với mã hóa tệp, điều này có nghĩa là tôi đã chuyển các tệp xung quanh các máy chủ Linux / Windows khác nhau thông qua ftp và rsync , với một loạt các trình soạn thảo văn bản. Tôi thực sự không biết nhiều về mã hóa ký tự, vì vậy sự giúp đỡ sẽ được đánh giá cao.

Nếu nó giúp, tập tin đang được lưu ở định dạng UTF-8 và gedit sẽ không cho phép tôi lưu nó ở định dạng ISO-8859-15 (tài liệu chứa một hoặc nhiều ký tự không thể được mã hóa bằng mã hóa ký tự được chỉ định). Tôi đã thử lưu nó với các kết thúc dòng Windows và Linux, nhưng không giúp được gì.


Điều này xuất hiện để giải quyết vấn đề. 95aluive.com/expression/index.html

30
Ai đó tước chúng tôi khỏi BOM
David Heffernan

Câu trả lời:


150

Ba từ dành cho bạn:

Dấu hiệu đặt hàng Byte (BOM)

Đó là đại diện cho BOM UTF-8 trong ISO-8859-1. Bạn phải nói với biên tập viên của bạn không sử dụng BOM hoặc sử dụng một trình soạn thảo khác để loại bỏ chúng.

Để tự động hóa việc loại bỏ BOM, bạn có thể sử dụng awknhư trong câu hỏi này .

Như một câu trả lời khác nói , tốt nhất là PHP sẽ thực sự diễn giải BOM chính xác, để bạn có thể sử dụng mb_internal_encoding(), như thế này:

 <?php
   //Storing the previous encoding in case you have some other piece 
   //of code sensitive to encoding and counting on the default value.      
   $previous_encoding = mb_internal_encoding();

   //Set the encoding to UTF-8, so when reading files it ignores the BOM       
   mb_internal_encoding('UTF-8');

   //Process the CSS files...

   //Finally, return to the previous encoding
   mb_internal_encoding($previous_encoding);

   //Rest of the code...
  ?>

Vâng tôi thấy rằng khi tôi googled nó, nhưng làm cách nào để loại bỏ chúng?
Matt

10
Nó không loại bỏ BOM, nó bỏ qua nó.
Cole Johnson

Hoặc cách khác (bỏ qua) có thể là thay đổi mã hóa.
mr5

Windows Notepad (ugh) thêm chúng; đề xuất từ ​​một bản sao của câu hỏi này là sử dụng Notepad ++, cho phép đặt "UTF-8 không có BOM" làm mã hóa. Hoặc sử dụng Trình chỉnh sửa thực sự ... (emacs!) :-)
jesup

2
Đó chính xác là vấn đề, mã hóa ký tự khác nhau sử dụng các byte khác nhau cho cùng một ký tự. Đọc lại đoạn thứ ba của câu trả lời.
Vinko Vrsalovic

24

Mở tệp của bạn trong Notepad ++ . Từ menu Mã hóa , chọn Chuyển đổi sang UTF-8 mà không có BOM , lưu tệp, thay thế tệp cũ bằng tệp mới này. Và nó sẽ hoạt động, chắc chắn.


1
Trong Notepad ++ v7.6.6 (64-bit), bạn cần nhấp vào Chuyển đổi thành UTF-8 .
stomy

23

Trong PHP , bạn có thể thực hiện các thao tác sau để xóa tất cả các ký tự không bao gồm ký tự được đề cập.

$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);

1
trong trường hợp bạn chỉ muốn giết "ï", hãy sử dụng $ reply = preg numplace ('/ [\ x80- \ xFF] //', '', $ reply);
guido _nhcol.com.br_

@ guido_nhcol.com.br_ Bạn thêm một khoản phụ /, nên là:$response = preg_replace('/[\x80-\xFF]/', '', $response);
H Aßdø tựa

20

Đối với những người có quyền truy cập shell ở đây là một lệnh nhỏ để tìm tất cả các tệp có BOM được đặt trong thư mục public_html - hãy chắc chắn thay đổi nó thành đường dẫn chính xác của bạn trên máy chủ của bạn là gì

Mã số:

grep -rl $'\xEF\xBB\xBF' /home/username/public_html

và nếu bạn cảm thấy thoải mái với trình soạn thảo vi , hãy mở tệp trong vi:

vi /path-to-file-name/file.php

Và nhập lệnh để loại bỏ BOM:

set nobomb

Lưu các tập tin:

wq

1
Sử dụng grep -rlI $'\xEF\xBB\xBF' .để bỏ qua các tệp nhị phân.
Nabi KAZ

11

BOM chỉ là một chuỗi các ký tự ($ EF $ BB $ BF cho UTF-8), vì vậy chỉ cần xóa chúng bằng các tập lệnh hoặc định cấu hình trình chỉnh sửa để nó không được thêm vào.

Từ loại bỏ BOM khỏi UTF-8 :

#!/usr/bin/perl
@file=<>;
$file[0] =~ s/^\xEF\xBB\xBF//;
print(@file);

Tôi chắc chắn rằng nó dịch sang PHP dễ dàng.


6
Lưu ý rằng BOM không phải là một chuỗi các ký tự, nó là một ký tự đơn. Nếu tệp ở dạng UTF-8, thì ký tự được biểu thị bằng ba byte . Nếu tệp ở dạng UTF-8, thì việc xem nó ở dạng mã hóa khác (nghĩa là một tệp trong đó EF BB BF xuất hiện ở vị trí BOM) là một lỗi. Để xóa BOM khỏi tệp UTF-8, người ta phải xóa ký tự (đơn) U + FEFF. Vâng, sư phạm!
Jeffrey L Whitledge

1
Tôi không thể làm việc với PHP (đó chỉ là sự bất tài của tôi chứ không phải của bạn: P), vì vậy tôi đã kiểm tra xem BOM có ở đó không và xóa 3 ký tự đầu tiên. Đây là mã, nếu bất cứ ai cần nó: if (chất nền ($ css, 0,3) == pack ("CCC", 0xef, 0xbb, 0xbf)) {$ css = chất nền ($ css, 3); }
Matt

7
nó dịch sang php là $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. trước khi sử dụng, hãy xem xét lại nếu bạn không thể khắc phục sự cố tại nguồn.
phổ biến

6

Đối với tôi, điều này đã làm việc:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Nếu tôi xóa meta này, ï »sẽ xuất hiện lại. Hy vọng điều này sẽ giúp ai đó ...


5

Tôi không biết PHP, vì vậy tôi không biết nếu điều này là có thể, nhưng giải pháp tốt nhất là đọc tệp dưới dạng UTF-8 thay vì một số mã hóa khác. BOM thực sự là một KHÔNG GIAN KHÔNG CÓ KHÔNG GIAN. Đây là khoảng trắng, vì vậy nếu tệp được đọc theo mã hóa chính xác (UTF-8), thì BOM sẽ được hiểu là khoảng trắng và nó sẽ bị bỏ qua trong tệp CSS kết quả.

Ngoài ra, một lợi thế khác của việc đọc tệp trong mã hóa chính xác là bạn không phải lo lắng về việc các ký tự bị hiểu sai. Trình chỉnh sửa của bạn đang nói với bạn rằng trang mã bạn muốn lưu nó sẽ không làm tất cả các ký tự mà bạn cần. Nếu PHP đang đọc tệp trong mã hóa không chính xác, thì rất có thể các ký tự khác ngoài BOM đang bị hiểu sai một cách âm thầm. Sử dụng UTF-8 ở mọi nơi và những vấn đề này biến mất.


3

Bạn có thể dùng

vim -e -c 'argdo set fileencoding=utf-8|set encoding=utf-8| set nobomb| wq'

Thay thế bằng awk có vẻ hiệu quả, nhưng nó không đúng chỗ.


2

grep -rl $ '\ xEF \ xBB \ xBF' * | xargs vim -e -c 'argdo set fileencoding = utf-8 | set mã hóa = utf-8 | thiết lập nobomb | wq '


Sử dụng grep -rlI $'\xEF\xBB\xBF' .để bỏ qua các tệp nhị phân. Và cũng .tốt hơn sau đó *ở đây.
Nabi KAZ

2

Tôi gặp vấn đề tương tự với BOM xuất hiện trong một số tệp PHP của tôi (ï »ï ï»).

Nếu bạn sử dụng PhpStorm, bạn có thể đặt tại phím nóng để xóa nó trong Cài đặt -> Cài đặt IDE -> Sơ đồ bàn phím -> Menu chính -> Tệp -> Xóa BOM.



2

Mở tệp PHP theo câu hỏi, trong Notepad ++.

Nhấp vào Mã hóa ở trên cùng và thay đổi từ "Mã hóa trong UTF-8 không có BOM" thành "Mã hóa trong UTF-8". Lưu và ghi đè tập tin trên máy chủ của bạn.


1

Cùng một vấn đề, giải pháp khác nhau.

Một dòng trong tệp PHP đã in ra các tiêu đề XML (sử dụng các thẻ bắt đầu / kết thúc giống như PHP). Có vẻ như mã trong các thẻ này đặt mã hóa và được thực thi trong PHP dẫn đến các ký tự lạ. Dù bằng cách nào thì đây là giải pháp:

# Original
$xml_string = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;";

# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";

1

Nếu bạn cần có thể xóa BOM khỏi các tệp được mã hóa UTF-8, trước tiên bạn cần phải có một trình soạn thảo nhận biết về chúng.

Cá nhân tôi sử dụng E Text Editor .

Ở phía dưới bên phải, có các tùy chọn để mã hóa ký tự, bao gồm thẻ BOM. Tải tệp của bạn, bỏ chọn Byte Order Marker nếu nó được chọn, lưu lại và nó sẽ được thực hiện.

Văn bản thay thế http://oth4.com/encoding.png

E không miễn phí, nhưng có bản dùng thử miễn phí và nó là một trình soạn thảo tuyệt vời ( khả năng tương thích TextMate hạn chế ).


1
Liên kết hình ảnh bị hỏng.
Peter Mortensen

1

Bạn có thể mở nó bằng PhpStorm và nhấp chuột phải vào tệp của bạn và nhấp vào Xóa BOM ...


1

Đây là một giải pháp tốt cho vấn đề với BOM. Đây là hai tập lệnh VBScript (.vbs).

Một để tìm BOM trong một tệp và một để giết BOM bị nguyền rủa trong tệp. Nó hoạt động khá tốt và dễ sử dụng.

Chỉ cần tạo tệp .vbs và dán đoạn mã sau vào đó.

Bạn có thể sử dụng tập lệnh VBScript chỉ bằng cách kéo và thả tệp đáng ngờ vào tệp .vbs. Nó sẽ cho bạn biết nếu có BOM hay không.

' Heiko Jendreck - personal helpdesk & webdesign
' http://www.phw-jendreck.de
' 2010.05.10 Vers 1.0
'
' find_BOM.vbs
' ====================
' Kleines Hilfsmittel, welches das BOM finden soll
'
 Const UTF8_BOM = ""
 Const UTF16BE_BOM = "þÿ"
 Const UTF16LE_BOM = "ÿþ"
 Const ForReading = 1
 Const ForWriting = 2
 Dim fso
 Set fso = WScript.CreateObject("Scripting.FileSystemObject")
 Dim f
 f = WScript.Arguments.Item(0)
 Dim t
 t = fso.OpenTextFile(f, ForReading).ReadAll
 If Left(t, 3) = UTF8_BOM Then
     MsgBox "UTF-8-BOM detected!"
 ElseIf Left(t, 2) = UTF16BE_BOM Then
     MsgBox "UTF-16-BOM (Big Endian) detected!"
 ElseIf Left(t, 2) = UTF16LE_BOM Then
     MsgBox "UTF-16-BOM (Little Endian) detected!"
 Else
     MsgBox "No BOM detected!"
 End If

Nếu nó cho bạn biết có BOM, hãy đi và tạo tệp .vbs thứ hai với mã sau đây và kéo tệp nghi ngờ vào tệp .vbs.

' Heiko Jendreck - personal helpdesk & webdesign
' http://www.phw-jendreck.de
' 2010.05.10 Vers 1.0
'
' kill_BOM.vbs
' ====================
' Kleines Hilfmittel, welches das gefundene BOM löschen soll
'
Const UTF8_BOM = ""
Const ForReading = 1
Const ForWriting = 2
Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Dim f
f = WScript.Arguments.Item(0)
Dim t
t = fso.OpenTextFile(f, ForReading).ReadAll
If Left(t, 3) = UTF8_BOM Then
    fso.OpenTextFile(f, ForWriting).Write (Mid(t, 4))
    MsgBox "BOM gelöscht!"
Else
    MsgBox "Kein UTF-8-BOM vorhanden!"
End If

Mã này là từ Heiko Jendreck .


1

Trong PHPStorm, đối với nhiều tệp và BOM không nhất thiết phải ở đầu tệp, bạn có thể tìm kiếm \x{FEFF}(Biểu thức chính quy) và thay thế bằng không có gì.


0

Cùng một vấn đề, nhưng nó chỉ ảnh hưởng đến một tệp nên tôi chỉ tạo một tệp trống, sao chép / dán mã từ tệp gốc sang tệp mới và sau đó thay thế tệp gốc. Không ưa thích nhưng nó đã làm việc.


0

Sử dụng Total Commander để tìm kiếm tất cả các tệp BOMed:

Cách thanh lịch để tìm kiếm các tệp UTF-8 với BOM?

  • Mở các tệp này trong một số trình soạn thảo thích hợp (nhận ra BOM) như Eclipse .

  • Thay đổi mã hóa của tệp thành ISO (nhấp chuột phải, thuộc tính).

  • Cắt ï »từ đầu tệp, lưu lại

  • Thay đổi mã hóa của tệp trở lại UTF-8

... và thậm chí không nghĩ về việc sử dụng n ... d nữa!


0

Tôi đã từng gặp vấn đề tương tự. Vấn đề là do một trong các tệp php của tôi nằm trong utf-8 (quan trọng nhất, tệp cấu hình được bao gồm trong tất cả các tệp php).

Trong trường hợp của tôi, tôi đã có 2 giải pháp khác nhau phù hợp với mình:

Đầu tiên, tôi đã thay đổi Cấu hình Apache bằng cách sử dụng AddDefaultCharsetDirective trong các tệp cấu hình (hoặc trong .htaccess). Giải pháp này buộc Apache phải sử dụng mã hóa chính xác.

AddDefaultCharset ISO-8859-1

Giải pháp thứ hai là thay đổi mã hóa xấu của tệp php.


0
  1. Sao chép văn bản của tệp filename.css của bạn.
  2. Đóng tệp css của bạn.
  3. Đổi tên nó thành filename2.css để tránh xung đột tên tệp.
  4. Trong MS Notepad hoặc Wordpad, tạo một tệp mới.
  5. Dán văn bản vào đó.
  6. Lưu nó dưới dạng filename.css, chọn UTF-8 từ các tùy chọn mã hóa.
  7. Tải lên tên tệp.css.

-3

Kiểm tra index.php, tìm "... charset=iso-8859-1" và thay thế bằng "... charset=utf-8".

Có lẽ nó sẽ hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.