PHP dosya kodlamasını tespit

5 Cevap php

Ben birine dosyaların sayısını birleştiren bir script var ve dosyalardan biri UTF8 kodlamasını olduğunda kırıyor. Ben dosyalarını okurken ben utf8_decode() fonksiyonu kullanılarak gerektiğini anlamaya, ama ben çözümünü gerekir hangi anlatmak için nasıl bilmiyorum.

Benim kod temelde:

$output = '';
foreach ($files as $filename) {
    $output .= file_get_contents($filename) . "\n";
}
file_put_contents('combined.txt', $output);

Şu anda, UTF8 dosya başlangıcında, bu çıktı, bu karakterler ekler: 

5 Cevap

mb_detect_encoding fonksiyonunu . This function will examine your string and attempt to "guess" what its encoding is. You can then convert it as desired. As brulak suggested kullanmayı deneyin, ancak, muhtemelen korumak için, to UTF-8 yerine from dönüştürme daha iyiyiz veriler iletilmesi demektir.

Çıkış olursa olsun öyleydi girdi ne tür, UTF-8 olduğundan emin olmak için, bu kullanın check:

if(!mb_check_encoding($output, 'UTF-8')
    OR !($output === mb_convert_encoding(mb_convert_encoding($output, 'UTF-32', 'UTF-8' ), 'UTF-8', 'UTF-32'))) {

    $output = mb_convert_encoding($content, 'UTF-8'); 
}

// $output is now safely converted to UTF-8!

Nasıl UTF-8 veya 16 veya 32 dosyadan olmayan ASCII karakterleri işlemek için gidiyorsun?

Burada bir tasarım sorunu olabilir düşünüyorum çünkü ben soruyorum.

UTF-8 (veya 16 ya da 32) yerine başka bir yol içine çıktı dosyasını dönüştürmek olacaktır.

O zaman bu sorun olmaz.

Ayrıca kaçan bir UTF8 kod dönüştürme doğabilecek güvenlik sorunlarını düşündünüz mü? See this comment:

Detecting multi-byte encoding

Kaynak dosyanızı kodlayan içinde ne olduğunu anlamaya, sonra UTF8 dönüştürmek ve gitmek için iyi olmalıdır.

I recently encountered this issue and the mb_convert_encoding() function output was UTF-8. After taking a look at the response headers, there wasn't anything mentioning the encoding type, so I found Set http header to utf-8 php, which proposes the following:

<?php
header('Content-Type: text/html; charset=utf-8');

Php dosyasının üstüne bu ekledikten sonra, korkak tüm karakterleri gitti ve olması gerektiği gibi işlenir. Bu orijinal afiş için aramaktadır mesele, ama ben meseleyi kendim çözmeye çalışırken bu buldum ve paylaşmak düşündüm emin değilim.

Bu bir cazibe gibi çalıştı benim çözümdür:

//check string strict for encoding out of list of supported encodings
$enc = mb_detect_encoding($str, mb_list_encodings(), true);

if ($enc===false){
    //could not detect encoding
}
else if ($enc!=="UTF-8"){
    $str = mb_convert_encoding($str, "UTF-8", $enc);
}
else {
    //UTF-8 detected
}