2016-04-12 16 views
1

Özellikle Excel'in bunları işleme biçimiyle CSV dosyaları aracılığıyla bir veritabanına veri alıp vermek için birkaç komut dosyasından UTF-8 davranışı alıyorum.Excel'in PHP kullanarak UTF-8 işlemlerini kolaylaştırmanın bir yolu var mı?

İçe

:

komut kendileri özellikle karmaşık değildir ve ben doğru kodlamayı ayarlıyorum inanıyoruz (kısalık uğruna, ben hata işleme ve karakter kaçan kodu hariç) genel

header("Content-Type: text/plain; charset=UTF-8"); 

require_once("inc.db.php"); // database connection 
mysql_query("SET NAMES utf8"); 

$csv = $_FILES['csv']; 
$handle = fopen($csv['tmp_name'], "r"); 

while ($data = fgetcsv($handle, 1000, ',', '"')) { 
    $first_name = $data[0]; 
    $family_name = $data[1]; 
    $company = $data[2]; 
    mysql_query("INSERT INTO table SET first_name = '$first_name', etc...); 
} 

İhracat

header("Content-Type: text/csv; charset=UTF-8"); 
header("Content-Disposition: attachment; filename=file.csv"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

echo "\xEF\xBB\xBF"); // utf-8 bom 
setlocale(LC_ALL, "en_US.UTF8"); 

require_once("inc.db.php"); // database connection 
mysql_query("SET NAMES utf8"); 

echo "FIRST NAME,FAMILY NAME,COMPANY,\n"; 

$query = mysql_query("SELECT first_name, family_name, company FROM table"); 
while ($data = mysql_fetch_assoc($query)) { 
    echo '"' . $first_name . '","' . $family_name. '","' . $company. '",\n'; 
} 

// Alternate attempt at looping below 

$array = array(); 
while ($data = mysql_fetch_assoc($query)) { 
    $array[] = $data; 
} 
$x = fopen("php://output", "w"); 
foreach ($array as $fields) { 
    fputcsv($x, $fields); 
} 
fclose($x); 

için Gözüm, bu senaryoların her ikisi de iyi çalışıyor, şu ana kadar hiç sorun yok. Ancak, Excel'de dışa aktarılan CSV dosyasını açtığımda ve çalıştığımda, ilginç şeyler burada başlar.

Veritabanındaki bilgiler, é ve Ü gibi yabancı latin karakterler içeriyor. Bunlar doğru bir şekilde saklanıyor (MySQL veritabanı kodlaması utf8_unicode_ci), henüz sorun yok. Ancak, üç senaryodan yalnızca ikisi doğru olarak çalışıyor. Ama tahmin et ki, işe yaramayacak olan (Senaryo İki), çalışmak zorunda olduğum şey ... bu her zaman böyle olmaz mı?


Ben hemen-yeniden içe aktarın bir CSV dosyasını dışa, ve One

Senaryo. Dosyayı hiçbir şekilde açmam veya değiştirmem.

Maalesef bu anlamsız bir alıştırmadır. Yine de işe yarıyor.


Sonra yeniden ithalat, açmak, bir CSV dosyasını dışa içeriğini değiştirmek, kaydetme ve İki

Senaryo.

İlginç not: Excel'deki iletişim menüsünden "Kaydet" i seçtiğinizde, CSV dosyasının üzerine yazmak yerine "Unicode Metin" dosyası olarak kaydedilir. Bu yeni dosya hala Excel'de açılıyor, ancak veriler bozuk. "Farklı Kaydet ..." i seçmem ve dosya türü menüsünden "Virgülle Ayrılmış Değerler" i seçmem gerekiyor. Bu adımda kodlama menüsünden UTF-8'i seçmeyi denedim.

bu senaryo ile sorun yabancı karakterlerin yatıyor: en kısa sürede ithal komut bunlardan birini ulaşır ulaşmaz, veritabanına bu alanı yazma basitçe durur. Bozuk karakter yok â€. Küçük soru işaretleri yok . Basitçe, hiçbir şey. Ancak, CSV'nin bu satırındaki verilerin geri kalanı iyi yazılmıştır.


Ben, açmak, bir CSV dosyasını dışa içeriğini değiştirmek, kaydetme, açık bir metin editörü, daha sonra, UTF-8 kodlaması ile yeniden ithalat yeniden kaydetmek Üç

Senaryo.

Yaşasın, işe yarıyor! Bununla birlikte, bu sistemin kullanıcılarının metin editörleri ve kodlamaları ile oynamasını bekleyemiyorum - dışa aktarma> düzenleme> kaydetme> kesintisiz olarak içe aktarılabilmeleri gerekir. script'lerime birinde

  1. Something (muhtemelen ithal) ™ Yanlış gidiyor Neler


    Benim Düşünceler doğru kodlamayı işleyen değil.

  2. Komut dosyalarından birinde (büyük olasılıkla dışa aktarma) bir CSV dosyası oluşturulamıyor, dolayısıyla Kaydet iletişim kutusundaki Unicode Metin dosya türü.
  3. Excel sadece gerçekten UTF-8 dosyalarını sevmiyor ve yapabileceğim hiçbir şey yok.

Lütfen bana burada benim hatamın olduğunu söyleyin ve bu konuda yapabileceğim bir yol var!

+0

Mac veya Excel'de Excel kullanıyor musunuz? Mac ile ilgili Excel'de farklı kodlamalarla karşılaştırıldığında Windows ile ilgili bazı sorunlar yaşadığımı biliyorum. – st2erw2od

+0

Bu, Windows, Office 2010 ve 2013 üzerindedir. – mpdc

cevap

0

Windows Excel'de, Unicode Text Farklı Kaydet seçeneği, bir sekme ile ayrılmış bir unicode dosyası yazar, ancak Windows, olduğu gibi, UTF16'da yazar. İçe aktarımınız muhtemelen UTF-8'i tahmin ediyor ve böylelikle 2-baytlık UTF-16LE kodlu yabancı karaktere çarptığında, kendi üzerine basıyor ve pes ediyor.

Dönüştürme yapmak veya içe aktarma komut dosyanızı UTF-16LE kodlanmış verileri kabul etmek üzere değiştirmek için linux komutunu iconv -f UTF-16LE -t utf8 yourfile.address > yourfile.address.tmp kullanabilirsiniz.

+0

Sorun şu ki, Farklı Kaydettiğimde, virgülle ayrılmış türüne dönüyorum. – mpdc

+0

Ayrıca, 'iconv()' veya 'mb_convert_encoding()' işlevleri de çalışır. – mpdc

+0

Yani dosyayı Excel'de açarsınız, sonra Unicode Metin Olarak Kaydet'i, sonra tekrar açarsınız? Tekrar açarsanız ve CSV Olarak Kaydet, artık unicode olmayacak. Excel, en azından benim tecrübemde, bir dosyayı virgülle ayrılmış AND unicode olarak dışa aktaramazsınız. Bu yüzden Unicode olarak dışa aktarıyorum ve daha sonra sınırlayıcıyı değiştirip utf16le'ı utf8'e başka bir programla dönüştürüyorum. Diğer yandan LibreOffice Calc, dışa aktarırken kodlamayı ve sınırlayıcıyı belirtmenize izin verir, bu nedenle bu programa geçiş yapmaktan daha iyi olabilirsiniz. – JNevill