파일 시작 부분에서 를 어떻게 제거합니까?


145

gedit를 사용하여 열면 괜찮아 보이는 CSS 파일이 있지만 PHP에서 읽을 때 (모든 CSS 파일을 하나로 병합하기 위해)이 CSS에는 다음 문자가 앞에 붙습니다.

PHP는 모든 공백을 제거하므로 코드 중간에 임의의 가 전체를 엉망으로 만듭니다. 언급했듯이 gedit에서 파일을 열면 실제로 이러한 문자를 볼 수 없으므로 쉽게 제거 할 수 없습니다.

나는 문제를 봤다. 파일 인코딩에는 분명히 잘못된 것이있다. 이것은 다양한 텍스트 편집기를 사용하여 ftp 및 rsync 를 통해 파일을 다른 Linux / Windows 서버로 옮겼 기 때문에 의미가있다 . 문자 인코딩에 대해서는 잘 모르므로 도움을 주시면 감사하겠습니다.

도움이된다면 파일이 UTF-8 형식으로 저장되고 gedit에서 ISO-8859-15 형식으로 저장할 수 없습니다 (문서에 지정된 문자 인코딩을 사용하여 인코딩 할 수없는 하나 이상의 문자가 포함되어 있음). Windows 및 Linux 줄 끝으로 저장하려고 시도했지만 도움이되지 않았습니다.


이것은 문제를 해결하는 것으로 보입니다. 95isalive.com/expression/index.html

30
누군가는 BOM 떨어져 우리를 제거
데이비드 헤퍼 넌

답변:


151

당신을위한 세 단어 :

바이트 주문 마크 (BOM)

이것이 ISO-8859-1의 UTF-8 BOM 표현입니다. BOM을 사용하지 않도록 편집기에 지시하거나 다른 편집기를 사용하여 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...
  ?>

그래, 나는 그것을 구글 검색 할 때 그것을 찾았지만 어떻게 제거합니까?
Matt

10
BOM을 제거하지 않고 무시합니다.
Cole Johnson

또는 다른 방법으로 (무시) ​​인코딩을 변경할 수 있습니다.
mr5

Windows 메모장 (ugh)이 추가합니다. 이 질문에 대한 제안은 Notepad ++를 사용하는 것으로, BOM없이 "UTF-8"을 인코딩으로 설정할 수 있습니다. 또는 실제 편집기를 사용하십시오 ... (emacs!) :-)
jesup

2
그것은 정확히 문제입니다. 다른 문자 인코딩은 동일한 문자에 대해 다른 바이트를 사용합니다. 답의 세 번째 단락을 다시 읽으십시오.
Vinko Vrsalovic

24

메모장 ++ 에서 파일을 엽니 다 . 로부터 인코딩 메뉴에서 BOM없이 UTF-8로 변환을 , 파일 저장이 새로운 파일로 이전 파일을 교체합니다. 그리고 그것은 효과가 있습니다.


1
메모장 ++ 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

쉘 액세스 권한이있는 사용자의 경우 public_html 디렉토리에 BOM이 설정된 모든 파일을 찾기위한 작은 명령이 있습니다. 서버에서 올바른 경로로 변경하십시오.

암호:

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은 일련의 문자 (UTF-8의 경우 $ EF $ BB $ BF)이므로 스크립트를 사용하여 제거하거나 편집기가 추가되지 않도록 구성하십시오.

에서 UTF-8에서 BOM을 제거 :

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

나는 그것이 PHP로 쉽게 번역 될 것이라고 확신합니다.


6
BOM은 일련의 문자가 아니라 단일 문자입니다. 파일이 UTF-8 인 경우 문자는 3 바이트 로 표시 됩니다 . 파일이 UTF-8 인 경우 다른 인코딩 (즉, BOM이 있어야하는 곳에 EF BB BF가 나타나는 것)으로 보는 것이 오류입니다. UTF-8 파일에서 BOM을 제거하려면 (단일) 문자 U + FEFF를 제거해야합니다. 그래, 농담!
Jeffrey L Whitledge

1
나는 PHP에서 그 일을 할 수 없었습니다. 누군가가 필요로한다면 여기에 코드가 있습니다 : 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 | 세트 인코딩 = utf-8 | 폭탄을 설정 | wq '


grep -rlI $'\xEF\xBB\xBF' .이진 파일을 무시하는 데 사용 합니다. 그리고 여기 .더 좋습니다 *.
Nabi KAZ

2

일부 PHP 파일 ( )에 BOM과 동일한 문제가있었습니다.

PhpStorm 을 사용하는 경우 설정-> IDE 설정-> 키맵-> 주 메뉴-> 파일-> BOM 제거에서 단축키를 제거하도록 단축키를 설정할 수 있습니다.



2

메모장에서 해당 PHP 파일을 엽니 다.

상단의 인코딩을 클릭하고 "BOM없이 UTF-8로 인코딩"에서 "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

UTF-8로 인코딩 된 파일에서 BOM을 제거해야하는 경우 먼저 파일을 인식하는 편집기를 확보해야합니다.

나는 개인적으로 E 텍스트 편집기를 사용 합니다.

오른쪽 하단에는 BOM 태그를 포함하여 문자 인코딩 옵션이 있습니다. 파일을로드하고 바이트 순서 마커가 선택되어있는 경우 선택을 취소하고 다시 저장하면 완료됩니다.

대체 텍스트 http://oth4.com/encoding.png

E는 무료가 아니지만 무료 평가판이 있으며 훌륭한 편집기입니다 (제한된 TextMate 호환성).


1
이미지 링크가 끊어졌습니다.
피터 Mortensen


1

다음은 BOM 문제에 대한 또 다른 좋은 솔루션입니다. 이들은 두 개의 VBScript (.vbs) 스크립트입니다.

하나는 파일에서 BOM을 찾기위한 것이고 다른 하나는 파일에서 손상된 BOM을 죽이기위한 것입니다. 꽤 잘 작동하고 사용하기 쉽습니다.

.vbs 파일을 만들고 다음 코드를 붙여 넣으십시오.

의심스러운 파일을 .vbs 파일로 끌어서 놓기 만하면 VBScript 스크립트를 사용할 수 있습니다. 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

PHPStorm에서 여러 파일 및 BOM이 파일의 시작 부분에있을 필요는 없지만 \x{FEFF}(정규 표현식)을 검색 하고 아무것도 대체하지 않을 수 있습니다.


0

같은 문제이지만 하나의 파일에만 영향을 미쳤으므로 빈 파일을 만들고 원본 파일에서 새 파일로 코드를 복사 / 붙여 넣은 다음 원본 파일을 바꿨습니다. 공상은 아니지만 효과가있었습니다.


0

Total Commander 를 사용 하여 모든 BOM 파일을 검색하십시오.

BOM을 사용하여 UTF-8 파일을 검색하는 우아한 방법은 무엇입니까?

  • Eclipse 와 같은 적절한 편집기 (BOM을 인식하는)에서이 파일을여십시오 .

  • 파일 인코딩을 ISO로 변경하십시오 (오른쪽 클릭, 속성).

  • 파일의 시작 부분에서 를 잘라 저장

  • 파일 인코딩을 다시 UTF-8로 변경

... n을 다시 사용하는 것에 대해 생각조차하지 않습니다!


0

나는 같은 문제가 있었다. 문제는 내 PHP 파일 중 하나가 utf-8 (모든 PHP 파일에 포함 된 가장 중요한 구성 파일)에 있기 때문입니다.

내 경우에는 2 가지 솔루션이있어 나를 위해 일했습니다.

먼저 구성 파일 (또는 .htaccess)에서 AddDefaultCharsetDirective를 사용하여 Apache 구성을 변경했습니다. 이 솔루션은 Apache가 올바른 encodage를 사용하도록합니다.

AddDefaultCharset ISO-8859-1

두 번째 해결책은 PHP 파일의 잘못된 인코딩을 변경하는 것이 었습니다.


0
  1. filename.css 파일의 텍스트를 복사하십시오.
  2. CSS 파일을 닫습니다.
  3. 파일 이름이 충돌하지 않도록 filename2.css로 이름을 바꿉니다.
  4. MS 메모장 또는 워드 패드에서 새 파일을 작성하십시오.
  5. 텍스트를 붙여 넣습니다.
  6. 인코딩 옵션에서 UTF-8을 선택하여 filename.css로 저장하십시오.
  7. filename.css를 업로드하십시오.

-3

를 확인하고 index.php"... charset=iso-8859-1"를 찾아 "... "로 바꾸십시오 charset=utf-8.

아마도 효과가있을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.