ฉันจะลบจากจุดเริ่มต้นของไฟล์ได้อย่างไร


145

ฉันมีไฟล์ CSS ที่ดูดีเมื่อฉันเปิดมันโดยใช้geditแต่เมื่อมันถูกอ่านโดย PHP (เพื่อรวมไฟล์ CSS ทั้งหมดไว้ในไฟล์เดียว) CSS นี้มีตัวอักษรต่อไปนี้ที่เสริมไว้: 

PHP ลบช่องว่างทั้งหมดดังนั้นการสุ่มที่อยู่ตรงกลางของโค้ดทำให้เกิดความวุ่นวายขึ้น ดังที่ฉันได้กล่าวไปแล้วฉันไม่สามารถเห็นตัวละครเหล่านี้ได้เมื่อฉันเปิดไฟล์ด้วย gedit ดังนั้นฉันจึงไม่สามารถลบออกได้อย่างง่ายดาย

ฉันพบปัญหาและเห็นได้ชัดว่ามีสิ่งผิดปกติเกิดขึ้นกับการเข้ารหัสไฟล์ซึ่งทำให้รู้สึกว่าฉันเปลี่ยนไฟล์ไปยังเซิร์ฟเวอร์ Linux / Windows ที่แตกต่างกันผ่านทาง ftp และrsyncพร้อมโปรแกรมแก้ไขข้อความ ฉันไม่รู้เกี่ยวกับการเข้ารหัสอักขระมากนักดังนั้นความช่วยเหลือจะได้รับการชื่นชม

หากช่วยได้ไฟล์จะถูกบันทึกในรูปแบบ UTF-8 และ gedit จะไม่ให้ฉันบันทึกในรูปแบบ ISO-8859-15 (เอกสารมีอักขระอย่างน้อยหนึ่งตัวที่ไม่สามารถเข้ารหัสโดยใช้การเข้ารหัสอักขระที่ระบุ) ฉันพยายามบันทึกด้วยปลาย Windows และ Linux แต่ก็ไม่ได้ช่วยอะไร


ดูเหมือนว่าจะแก้ปัญหาได้ 95isalive.com/expression/index.html

30
ใครบางคนถอดเราออก BOM
David Heffernan

คำตอบ:


151

สามคำสำหรับคุณ:

เครื่องหมายคำสั่งซื้อแบบไบต์ (BOM)

นั่นเป็นตัวแทนของ UTF-8 BOM ใน ISO-8859-1 คุณต้องบอกให้ผู้แก้ไขไม่ใช้ BOM หรือใช้เครื่องมือแก้ไขอื่นเพื่อตัดออก

ในการลบ BOM โดยอัตโนมัติคุณสามารถใช้awkตามที่แสดงในคำถามนี้

อย่างที่คำตอบอีกข้อหนึ่งบอกว่าสิ่งที่ดีที่สุดสำหรับ PHP คือการตีความ BOM อย่างถูกต้องเพื่อให้คุณสามารถใช้mb_internal_encoding()เช่นนี้

 <?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...
  ?>

ใช่ฉันพบว่าเมื่อฉัน googled มัน แต่ฉันจะลบพวกเขาได้อย่างไร
Matt

10
มันไม่ได้ลบ BOM แต่จะไม่สนใจมัน
โคลจอห์นสัน

หรือวิธีอื่น (เพิกเฉย) อาจเปลี่ยนการเข้ารหัส
mr5

Windows Notepad (เพิ่ม) คำแนะนำจากคำถามสองข้อนี้คือการใช้ Notepad ++ ซึ่งอนุญาตให้ตั้งค่า "UTF-8 without BOM" เป็นการเข้ารหัส หรือใช้โปรแกรมแก้ไขจริง ... (emacs!) :-)
jesup

2
นั่นคือปัญหาการเข้ารหัสตัวอักษรที่แตกต่างกันใช้ไบต์ที่แตกต่างกันสำหรับตัวละครเดียวกัน อ่านอีกครั้งในวรรคที่สามของคำตอบ
Vinko Vrsalovic

24

เปิดแฟ้มในNotepad ++ จากเมนูการเข้ารหัสเลือกแปลงเป็น UTF-8 โดยไม่มี BOMบันทึกไฟล์แทนที่ไฟล์เก่าด้วยไฟล์ใหม่นี้ และมันจะทำงานได้แน่นอน


1
ใน Notepad ++ v7.6.6 (64 บิต) คุณจะต้องคลิกแปลง UTF-8
stomy

23

ในPHPคุณสามารถทำสิ่งต่อไปนี้เพื่อลบอักขระที่ไม่ใช่ทั้งหมดรวมถึงอักขระที่เป็นปัญหา

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

1
ในกรณีที่คุณต้องการฆ่า "ï" ให้ใช้ $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response);
guido _nhcol.com.br_

@ guido_nhcol.com.br_ คุณเพิ่มพิเศษ/มันควรจะเป็น:$response = preg_replace('/[\x80-\xFF]/', '', $response);
H Aßdøµ

20

สำหรับผู้ที่มีการเข้าถึงแบบเชลล์นี่เป็นคำสั่งเล็กน้อยในการค้นหาไฟล์ทั้งหมดที่มี BOM ตั้งอยู่ในไดเรกทอรี public_html - ให้แน่ใจว่าได้เปลี่ยนเป็นเส้นทางที่ถูกต้องบนเซิร์ฟเวอร์ของคุณ

รหัส:

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

และถ้าคุณพอใจกับเอดิเตอร์viให้เปิดไฟล์ใน vi:

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

และป้อนคำสั่งเพื่อลบ BOM:

set nobomb

บันทึกไฟล์:

wq

1
ใช้grep -rlI $'\xEF\xBB\xBF' .เพื่อละเว้นไฟล์ไบนารี
Nabi KAZ

11

BOM เป็นเพียงลำดับของอักขระ ($ EF $ BB $ BF สำหรับ UTF-8) ดังนั้นให้ลบออกโดยใช้สคริปต์หรือกำหนดค่าเครื่องมือแก้ไขดังนั้นจึงไม่เพิ่ม

จากการลบ BOM ออกจาก UTF-8 :

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

ฉันแน่ใจว่ามันแปลเป็น PHP ได้อย่างง่ายดาย


6
โปรดทราบว่า BOM ไม่ใช่ลำดับของอักขระ แต่เป็นอักขระเดียว ถ้าไฟล์เป็น UTF-8 แล้วตัวละครตัวนี้เป็นตัวแทนในสามไบต์ หากไฟล์อยู่ใน UTF-8 ให้ดูไฟล์นั้นในการเข้ารหัสอื่น (เช่นไฟล์หนึ่งที่ EF BB BF ปรากฏขึ้นในตำแหน่งที่ควร BOM) เป็นข้อผิดพลาด ในการลบ BOM ออกจากไฟล์ UTF-8 เราควรลบ charcter U + FEFF ใช่อวดรู้!
Jeffrey L Whitledge

1
ฉันไม่สามารถใช้งาน PHP ได้ (นั่นเป็นเพียงการขาดคุณสมบัติของฉันไม่ใช่ของคุณ: P) ดังนั้นฉันจึงตรวจสอบเพื่อดูว่า BOM อยู่ที่นั่นและลบอักขระ 3 ตัวแรกออกหรือไม่ นี่คือรหัสถ้าใครต้องการ: if (substr ($ css, 0,3) == pack ("CCC", 0xef, 0xbb, 0xbf)) {$ css = substr ($ css, 3); }
Matt

7
มันแปลเป็น PHP $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);เป็น ก่อนที่คุณจะใช้สิ่งนี้ให้พิจารณาอีกครั้งหากคุณไม่สามารถแก้ไขปัญหาที่แหล่งที่มาแทนได้
commonpike

6

สำหรับฉันมันใช้งานได้:

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

หากฉันลบเมตานี้ออกจะปรากฏขึ้นอีกครั้ง หวังว่านี่จะช่วยใครซักคน ...


5

ฉันไม่รู้ PHP ดังนั้นฉันไม่รู้ว่ามันเป็นไปได้หรือไม่ แต่ทางออกที่ดีที่สุดคือการอ่านไฟล์ในรูปแบบ UTF-8 แทนที่จะเข้ารหัสแบบอื่น จริง ๆ แล้ว BOM คือ ZERO WIDTH NO BREAK SPACE นี่คือช่องว่างดังนั้นหากไฟล์ถูกอ่านในการเข้ารหัสที่ถูกต้อง (UTF-8) แล้ว BOM จะถูกตีความเป็นช่องว่างและจะถูกละเว้นในไฟล์ CSS ที่เป็นผลลัพธ์

นอกจากนี้ข้อดีอีกประการของการอ่านไฟล์ในการเข้ารหัสที่ถูกต้องคือคุณไม่ต้องกังวลกับตัวอักษรที่ถูกตีความผิด ตัวแก้ไขของคุณกำลังบอกคุณว่าหน้ารหัสที่คุณต้องการบันทึกนั้นจะไม่ทำอักขระทั้งหมดที่คุณต้องการ หาก PHP กำลังอ่านไฟล์ในการเข้ารหัสที่ไม่ถูกต้องก็มีความเป็นไปได้สูงที่ตัวละครอื่น ๆ นอกเหนือจาก BOM จะถูกตีความผิดอย่างเงียบ ๆ ใช้ UTF-8 ได้ทุกที่และปัญหาเหล่านี้จะหายไป


3

คุณสามารถใช้ได้

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

การแทนที่ด้วย awk ดูเหมือนจะใช้งานได้ แต่ไม่ได้อยู่ในตำแหน่ง


2

grep -rl $ '\ xEF \ xBB \ xBF' * | xargs vim -e -c 'argdo set fileencoding = utf-8 | set encoding = utf-8 | ชุดขุนนาง WQ'


ใช้grep -rlI $'\xEF\xBB\xBF' .เพื่อละเว้นไฟล์ไบนารี และยัง.ดีกว่า*ที่นี่แล้ว
Nabi KAZ

2

ฉันมีปัญหาเดียวกันกับ BOM ที่ปรากฏในไฟล์ PHP บางไฟล์ของฉัน ()

หากคุณใช้PhpStormคุณสามารถตั้งค่าที่ฮอตคีย์เพื่อลบออกในการตั้งค่า -> การตั้งค่า IDE -> Keymap -> เมนูหลัก -> ไฟล์หลัก -> ไฟล์ -> ลบ BOM



2

เปิดไฟล์ PHP ภายใต้คำถามใน Notepad ++

คลิกที่การเข้ารหัสที่ด้านบนและเปลี่ยนจาก "การเข้ารหัสใน UTF-8 ไม่มี BOM" เป็นเพียง "การเข้ารหัสใน UTF-8" บันทึกและเขียนทับไฟล์บนเซิร์ฟเวอร์ของคุณ


1

ปัญหาเดียวกันทางออกที่แตกต่าง

หนึ่งบรรทัดในไฟล์ PHP คือการพิมพ์ส่วนหัวของ XML (ซึ่งใช้แท็กเริ่มต้น / สิ้นสุดเหมือนกับ PHP) ดูเหมือนว่ารหัสภายในแท็กเหล่านี้จะตั้งค่าการเข้ารหัสและดำเนินการภายใน PHP ซึ่งทำให้เกิดอักขระแปลก ๆ ไม่ว่าจะเป็นวิธีการแก้ปัญหา:

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

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

1

หากคุณต้องการที่จะลบ BOM ออกจากไฟล์ที่เข้ารหัส UTF-8 อันดับแรกคุณต้องได้รับการแก้ไขจากเครื่องมือที่รู้จัก

ฉันใช้E Text Editor เป็นส่วนตัว

ที่ด้านล่างขวามีตัวเลือกสำหรับการเข้ารหัสอักขระรวมถึงแท็ก BOM โหลดไฟล์ของคุณยกเลิกการเลือก Byte Order Marker หากมีการเลือกบันทึกใหม่และควรทำ

Alt text http://oth4.com/encoding.png

E ไม่ฟรี แต่มีการทดลองใช้ฟรีและเป็นโปรแกรมแก้ไขที่ยอดเยี่ยม ( ความเข้ากันได้กับTextMateจำกัด)


1
ลิงค์รูปภาพเสีย
Peter Mortensen


1

นี่เป็นอีกวิธีแก้ปัญหาที่ดีสำหรับปัญหา BOM นี่คือสคริปต์VBScript (.vbs) สองตัว

อันแรกสำหรับการค้นหา BOM ในไฟล์และอีกอันสำหรับการฆ่า BOM ที่ถูกสาปในไฟล์ มันใช้งานได้ดีและใช้งานง่าย

เพียงแค่สร้างไฟล์. vbs และวางรหัสต่อไปนี้ลงไป

คุณสามารถใช้สคริปต์ VBScript เพียงแค่ลากและวางไฟล์ที่น่าสงสัยลงในไฟล์. vbs มันจะบอกคุณว่ามี BOM หรือไม่

' 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

ถ้ามันบอกคุณว่ามี BOM ให้ไปและสร้างไฟล์. vbs ที่สองด้วยรหัสต่อไปนี้แล้วลากไฟล์ suspicios ไปยังไฟล์. 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

รหัสจากHeiko Jendreck


1

ใน PHPS รูปแบบสำหรับไฟล์หลายไฟล์และ BOM ไม่จำเป็นต้องอยู่ที่จุดเริ่มต้นของไฟล์คุณสามารถค้นหา\x{FEFF}(นิพจน์ปกติ) และแทนที่ด้วยไม่มีอะไร


0

ปัญหาเดียวกัน แต่มีผลกับไฟล์เดียวดังนั้นฉันเพิ่งสร้างไฟล์เปล่าคัดลอก / วางโค้ดจากไฟล์ต้นฉบับไปยังไฟล์ใหม่จากนั้นแทนที่ไฟล์เดิม ไม่แฟนซี แต่มันใช้งานได้


0

ใช้Total Commanderเพื่อค้นหาไฟล์ BOMed ทั้งหมด:

วิธีที่สวยงามในการค้นหาไฟล์ UTF-8 ด้วย BOM?

  • เปิดไฟล์เหล่านี้ในบางแก้ไขที่เหมาะสม (ที่ตระหนักถึง BOM) เช่นEclipse

  • เปลี่ยนการเข้ารหัสของไฟล์เป็น ISO (คลิกขวาคุณสมบัติ)

  • ตัดจากจุดเริ่มต้นของไฟล์บันทึก

  • เปลี่ยนการเข้ารหัสของไฟล์กลับเป็น UTF-8

... และอย่าคิดแม้แต่จะใช้ n ... d อีกครั้ง!


0

ผมมีปัญหาเหมือนกัน. ปัญหาเกิดขึ้นเนื่องจากไฟล์ php ไฟล์หนึ่งของฉันอยู่ใน utf-8 (ที่สำคัญที่สุดคือไฟล์กำหนดค่าซึ่งรวมอยู่ในไฟล์ php ทั้งหมด)

ในกรณีของฉันฉันมีวิธีแก้ไขปัญหา 2 แบบซึ่งทำงานให้ฉัน:

ก่อนอื่นฉันเปลี่ยน Apache Configuration โดยใช้ AddDefaultCharsetDirective ในไฟล์การกำหนดค่า (หรือใน. htaccess) โซลูชันนี้บังคับให้ Apache ใช้การเข้ารหัสที่ถูกต้อง

AddDefaultCharset ISO-8859-1

ทางออกที่สองคือการเปลี่ยนการเข้ารหัสที่ไม่ดีของไฟล์ php


0
  1. คัดลอกข้อความของไฟล์ filename.css ของคุณ
  2. ปิดไฟล์ css ของคุณ
  3. เปลี่ยนชื่อเป็น filename2.css เพื่อหลีกเลี่ยงการปะทะกันของชื่อไฟล์
  4. ใน MS Notepad หรือ Wordpad ให้สร้างไฟล์ใหม่
  5. วางข้อความลงไป
  6. บันทึกเป็น filename.css เลือก UTF-8 จากตัวเลือกการเข้ารหัส
  7. อัพโหลด filename.css

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.