2010-08-20 9 views
3

각 국가/지역을 기준으로 작은 파일을 분리하는 세계 국가/지역이 포함 된 큰 파일이 있습니다. 원본 파일과 같은 항목을 포함 : 나는 그것을 추출하고 새 파일에 기록 그러나PHP로 UTF-8로 인코딩 된 파일을 작성하는 중 문제가 발생했습니다.

EE.04 Järvamaa 
    EE.05 Jõgevamaa 
    EE.07 Läänemaa 

를 텍스트가된다 :

EE.04 Järvamaa 
    EE.05 Jõgevamaa 
    EE.07 Läänemaa 

내가 다음 코드를 사용하고 내 파일을 저장하려면 :

mb_detect_encoding($text, "UTF-8") == "UTF-8" ? : $text = utf8_encode($text); 
$fp = fopen(MY_LOCATION,'wb'); 
fwrite($fp,$text); 
fclose($fp); 

나는 utf8_encode로하고하지 않고 파일을 저장하려고()와 둘 다 작동 것 같다. 원본 인코딩 (UTF8)을 저장하는 방법은 무엇입니까?

감사합니다. 다음과 같이

+0

은 생성 된 파일을 UTF8로 해석하는 편집기입니다. :) –

+0

파일을 읽은 후 파일을 처리하나요? PHP 소스 파일이 UTF-8입니까? – dionyziz

+0

Btw. 나는 mb_detect_encoding에 의존하지 않을 것이다. $ text가 utf8에 이미 있다는 것을 안다면 utf8_encode에 대한 호출뿐만 아니라 그것을 제거하십시오. –

답변

4

이 먼저 떨어져, mb_detect_encoding에 의존하지 않습니다. 특정 엔티티 (다른 엔코딩에서 유효하지 않은 엔티티)를 인코딩하는 경우가 아니면 인코딩이 무엇인지 알아내는 것이 좋습니다.

mb_detect_encoding 줄을 모두 제거해보십시오.

아, 그리고 utf8_encodeUTF-8 문자열로 Latin-1 문자열을집니다 (하지 임의의 캐릭터 세트에서 당신이 정말로 원하는 것입니다 UTF-8에) ... 당신은 iconv 원하지만, 당신은 소스 인코딩을 알 필요가 (이후 mb_detect_encoding을 정말로 신뢰할 수 없다면 다른 방법으로 찾아야합니다.)

아니면 빈 입력 인코딩 $str = iconv('', 'UTF-8', $str); (또는 작동하지 않을 수 있음)으로 iconv를 사용하여 시도 할 수는 ...

+0

빈 입력 인코딩과 함께 iconv를 사용했을 때 "입력 문자열에 잘못된 문자가 감지되었습니다."라는 내용의 알림 메시지가 나타나고 출력은 여전히 ​​엉망입니다. 원본 인코딩을 알아 내려고 시도하면 어떻게 될까요? – user387302

+0

['mb_detect_encoding'] (http://www.php.net/manual/en/function.mb-detect-order.php)을 사용하고 결과를'iconv '에 넣을 수 있습니다. 그러나 감지 할 수있는 문자 집합에는 몇 가지 제한 사항이 있음을 알 수 있습니다. 'false'를 반환하면, 다른 옵션은 16 진수 편집기를 파기하고 알려진 멀티 바이트 문자에 대한 엔티티를 찾은 다음 인터넷에서 해당 글리프를 검색하여 인코딩이 무엇인지 알아 내려고 시도하는 것입니다. 어디에서 파일을 가져 왔습니까? (힌트를 제공 할 수 있습니다) ... – ircmaxell

+0

@ircmaxell, geonames.org (http://download.geonames.org/export/dump/readme.txt)에서 파일을 받았습니다. 웹 사이트에 따르면 인코딩은 UTF-8입니다. – user387302

-1

당신은 그것을 할 수 있습니다 :

<?php 
$s = "This is a string éèàç and it is in utf-8"; 
$f = fopen('myFile',"w"); 
fwrite($f, utf8_encode($s)); 
fclose($f); 
?> 
-1

당신의 소스 파일이 UTF-8로, 사실,하지 않은 것 같습니다. 사용하고있는 것과 같은 접근 방식을 사용하려고 할 수도 있지만 UTF-16과 같은 다른 인코딩을 사용하는 것이 좋습니다.

1

이렇게 작동하지 않습니다. utf8_encode ($ theString)을 사용하더라도 UTF8 파일을 만들지 않습니다.

정답은 UTF-8 바이트 순서 표시과 관련이 있습니다.

문제를 이해하기 : - http://en.wikipedia.org/wiki/Byte_order_mark
- http://unicode.org/faq/utf_bom.html

이 솔루션은 다음 경우 : UTF-8 바이트 순서 표시로 것은 우리가 그것을 추가해야한다 'XBF \ XEF \ xbb \'을하다 문서의 헤더에 추가합니다.

<?php 
function writeStringToFile($file, $string){ 
$f=fopen($file, "wb"); 
$file="\xEF\xBB\xBF".$string; // utf8 bom 
fputs($f, $string); 
fclose($f); 
} 
?> 

는 $ 파일은 아무 텍스트 나 XML ... 은 $ 문자열이 문자열을 인코딩 된 UTF8입니다 수 있습니다.

지금 시도해보십시오. 그러면 UTF8 콘텐츠 (문자열)로 UTF8로 인코딩 된 파일이 작성됩니다.

writeStringToFile('test.xml', 'éèàç'); 
+0

UTF-8 관련 자료는 BOM이있는 UTF-8 파일을 작성하지 않을 것을 제안합니다. 왜 달리 제안 할 것이라고 생각하는지 설명 할 수 있습니까? 또한 게시 한 코드에는 오류가 있으며 작동하도록 설명하는대로 작동하지 않습니다. 검토하시기 바랍니다. – hakre

+0

죄송합니다, hakra, 해결했습니다. 다른 방법으로는 작동하지 않으므로 BOM 헤더를 사용하고 있습니다. 예를 들어 솔루션 벨로우즈는 다음과 같은 결과를 생성합니다. "이것은 문자열이며, UTF-8입니다." BOM 헤더를 생성하면 예상 결과가 생성됩니다. "이 문자열은 éèàç이며 utf-8입니다." –

+0

나는이 방법을 권장하지 않는 이유를 알지 못하므로 다른 방법을 사용하는 것이 가능할 것이라고 생각하지 않습니다. 출력을 HTML 페이지에 표시하고 인코딩을 UTF8로 설정하면 올바르게 표시되므로 HTML 파일의 BOM을 변경할 필요가 없습니다. 그러나 텍스트 파일, CSV 및 XML의 경우 UTF-8로 인코딩되지 않으며 단순히 UTF8로 문서를 선언해도 예상 결과가 생성되지 않습니다. UTF8을 알리는 바이트 시퀀스를 가져 와서 ''선언을 사용하여 xml 파일을 작성하십시오. 'éèàç'를 노드로 추가하고 확인하십시오. –

0

은 아마 당신은 출력하기 전에 파일 html_entity_decode($fetchedData)로 쓰기 전에 htmlentities($text)를 호출합니다. 스칸디나비아 문자로 작동합니다.

관련 문제